您的位置:首页 > 编程语言 > C#

XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

2015-11-21 05:10 896 查看

XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

http://blog.csdn.net/gdjlc/article/details/11374787

2013-09-08 12:16 2824人阅读 评论(0) 收藏 举报


分类:
XML(5)


版权声明:本文为博主原创文章,未经博主允许不得转载。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大。

作用有:

①定义可出现在文档中的元素

②定义可出现在文档中的属性

③定义哪个元素是子元素

④定义子元素的次序

⑤定义子元素的数目

⑥定义元素是否为空,或者是否可包含文本

⑦定义元素和属性的数据类型

⑧定义元素和属性的默认值以及固定值

XSD元素可分为简单元素和复杂元素。

一、简单元素

简易元素指仅包含文本的元素,它不会包含任何其他的元素或属性。

例如XML文档:

<Name>张三</Name>

用XSD可写为

<xs:element name="Name" type="xs:string"/>

此处“Name”是元素的名称,“xs:string”是XML Schema内建的数据类型。

最常用的类型有:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time等。

如果要指定元素的默认值或固定值,默认值用default定义,固定值用fixed定义。

<xs:element name="Name" type="xs:string" default="张三"/>

<xs:element name="Name" type="xs:string" fixed="张三"/>

也可限定元素的取值范围,例如限定字符串的长度为2至4,则可写为如下:

<xs:element name="Name">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:minLength value="2" />

<xs:maxLength value="4" />

</xs:restriction>

</xs:simpleType>

</xs:element>

也可以写成:

<xs:element name="Name" type="tns:T_Name" />

<xs:simpleType name="T_Name">

<xs:restriction base="xs:string">

<xs:minLength value="2" />

<xs:maxLength value="4" />

</xs:restriction>

</xs:simpleType>

二、复合元素

复合元素包含了其他的元素及/或属性。

有四种类型的复合元素:

①空元素

②包含其他元素的元素

③仅包含文本的元素

④包含元素和文本的元素

一个XML代码:

<Person id="1">

<Name>张三</Name>

<Age>120</Age>

</Person>

在 XML Schema 中,可定义为:

<xs:element name="Person" maxOccurs="unbounded">

<xs:complexType>

<xs:sequence>

<xs:element name="Name" type="xs:string" />

<xs:element name="Age" type="xs:string" />

</xs:sequence>

<xs:attribute name="id" type="xs:int" use="required" />

</xs:complexType>

</xs:element>

一些用法说明:

1、maxOccurs="unbounded"

maxOccurs为Occurrence 指示器,Occurrence 指示器用于定义某个元素出现的频率,有2种类型分别是 maxOccurs和minOccurs ,默认值均为 1。

① maxOccurs 指示器:规定某个元素可出现的最大次数

如<xs:element name="Name" type="xs:string" maxOccurs="10"/>

规定元素“Name”最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。

② minOccurs 指示器:规定某个元素能够出现的最小次数

如<xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="10"/>

规定元素“Name”最少出现0次,最多出现 10 次。

提示:如需使某个元素的出现次数不受限制,使用 maxOccurs="unbounded" 这个声明

上面<xs:element name="Person" maxOccurs="unbounded">表示元素“Person”出现次数最少一次(其中 minOccurs 的默认值是 1),并且任意次数。

2、<xs:sequence>

<xs:sequence>为“Order 指示器”,Order 指示器用于定义元素的顺序,有3种类型分别是All、Choice、Sequence。

① all 指示器:规定子元素可以按照任意顺序出现

② Choice 指示器:规定可出现某个子元素或者可出现另外一个子元素(非此即彼)

③ Sequence 指示器:规定子元素必须按照特定的顺序出现

上面例子代码用<xs:sequence>规定了子元素“Name”和“Age”必须按顺序出现。

3、use="required"

use 指示如何使用属性,有3种:

① optional :属性是可选的并且可以具有任何值。这是默认设置。

<xs:attribute name="id" type="xs:int"/>等价于

<xs:attribute name="id" type="xs:int" use="optional"/>

可验证通过<Person>或<Person id="1">

② required :属性必须出现一次。

<xs:attribute name="id" type="xs:int" use="required"/>

可验证通过<Person id="1">

③ prohibited :不能使用属性。

<xs:attribute name="id" use="prohibited"/>

规定了不能使用id的属性。

实例1(无引用命名空间):

Persons.xml

<?xml version="1.0" encoding="UTF-8"?>
<Persons>
<Person id="1">
<Name>张三</Name>
<Age>120</Age>
</Person>
<Person id="2">
<Name>李四</Name>
<Age>20</Age>
</Person>
</Persons>


Persons.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:annotation>
<xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
</xs:annotation>
<xs:element name="Persons">
<xs:complexType>
<xs:sequence>
<xs:element name="Person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="4" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Age">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:int"></xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>


实例2(有引用命名空间):

Persons2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem">
<Person id="1">
<Name>张三</Name>
<Age>120</Age>
</Person>
<Person id="2">
<Name>李四</Name>
<Age>20</Age>
</Person>
</Persons>


Persons2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.xxx.com/XxxSystem" >

<xs:annotation>
<xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
</xs:annotation>

<xs:annotation>
<xs:documentation>姓名</xs:documentation>
</xs:annotation>
<xs:simpleType name="T_Name">
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="4" />
</xs:restriction>
</xs:simpleType>
<xs:annotation>
<xs:documentation>年龄</xs:documentation>
</xs:annotation>
<xs:simpleType name="T_Age">
<xs:restriction base="xs:string">
<xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
</xs:restriction>
</xs:simpleType>
<xs:annotation>
<xs:documentation>属性ID</xs:documentation>
</xs:annotation>
<xs:simpleType name="T_id">
<xs:restriction base="xs:int"></xs:restriction>
</xs:simpleType>

<xs:element name="Persons">
<xs:complexType>
<xs:sequence>
<xs:element name="Person" maxOccurs="unbounded" type="tns:T_Person"/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:complexType name="T_Person">
<xs:sequence>
<xs:element name="Name" type="tns:T_Name" />
<xs:element name="Age" type="tns:T_Age" />
</xs:sequence>
<xs:attribute name="id" type="tns:T_id" use="required" />
</xs:complexType>

</xs:schema>


C# 使用xsd文件验证XML文件格式

/// <summary>
/// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示
/// </summary>
/// <param name="xmlFile">xml文件</param>
/// <param name="xsdFile">xsd文件</param>
/// <param name="namespaceUrl">命名空间,无则默认为null</param>
/// <returns></returns>
public static string XmlValidationByXsd(string xmlFile, string xsdFile, string namespaceUrl = null)
{
StringBuilder sb = new StringBuilder();
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(namespaceUrl, xsdFile);
settings.ValidationEventHandler += (x,y)=>
{
sb.AppendFormat("{0}|", y.Message);
};
using (XmlReader reader = XmlReader.Create(xmlFile, settings))
{
try
{
while (reader.Read());
}
catch (XmlException ex)
{
sb.AppendFormat("{0}|", ex.Message);
}
}
return sb.ToString();
}


2013-10-17备注

上面代码是验证xml文件,如果是xml字符串,则可用下面:

/// <summary>
/// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示
/// </summary>
/// <param name="xmlText">xml文本内容</param>
/// <param name="schemaFile">xsd文件</param>
/// <returns></returns>
public static string XmlValidateByXsd(string xmlText, string schemaFile)
{
StringBuilder sb = new StringBuilder();
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, schemaFile);
settings.ValidationEventHandler += (x, y) =>
{
sb.AppendFormat("{0}\n", y.Message);
};
using (XmlReader reader = XmlReader.Create(new StringReader(xmlText), settings))
{
try
{
while (reader.Read()) ;
}
catch (XmlException ex)
{
sb.AppendFormat("{0}\n", ex.Message);
}
}
return sb.ToString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: