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

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 >?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Persons>
  3. <Person >
  4. <Name>李四</Name>
  5. <Age>20</Age>
  6. </Person>
  7. </Persons>

Persons.xsd

[html]view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  3. <xs:annotation>
  4. <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
  5. </xs:annotation>
  6. <xs:element name="Persons">
  7. <xs:complexType>
  8. <xs:sequence>
  9. <xs:element name="Person" maxOccurs="unbounded">
  10. <xs:complexType>
  11. <xs:sequence>
  12. <xs:element name="Name">
  13. <xs:simpleType>
  14. <xs:restriction base="xs:string">
  15. <xs:minLength value="2" />
  16. <xs:maxLength value="4" />
  17. </xs:restriction>
  18. </xs:simpleType>
  19. </xs:element>
  20. <xs:element name="Age">
  21. <xs:simpleType>
  22. <xs:restriction base="xs:string">
  23. <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
  24. </xs:restriction>
  25. </xs:simpleType>
  26. </xs:element>
  27. </xs:sequence>
  28. <xs:attribute name="id" use="required">
  29. <xs:simpleType>
  30. <xs:restriction base="xs:int"></xs:restriction>
  31. </xs:simpleType>
  32. </xs:attribute>
  33. </xs:complexType>
  34. </xs:element>
  35. </xs:sequence>
  36. </xs:complexType>
  37. </xs:element>
  38. </xs:schema>

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

Persons2.xml

[html]view plaincopyprint?

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

Persons2.xsd

[html]view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xs:schema elementFormDefault="qualified"
  3. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  4. xmlns:tns="http://www.xxx.com/XxxSystem" >
  5. <xs:annotation>
  6. <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
  7. </xs:annotation>
  8. <xs:annotation>
  9. <xs:documentation>姓名</xs:documentation>
  10. </xs:annotation>
  11. <xs:simpleType name="T_Name">
  12. <xs:restriction base="xs:string">
  13. <xs:minLength value="2" />
  14. <xs:maxLength value="4" />
  15. </xs:restriction>
  16. </xs:simpleType>
  17. <xs:annotation>
  18. <xs:documentation>年龄</xs:documentation>
  19. </xs:annotation>
  20. <xs:simpleType name="T_Age">
  21. <xs:restriction base="xs:string">
  22. <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
  23. </xs:restriction>
  24. </xs:simpleType>
  25. <xs:annotation>
  26. <xs:documentation>属性ID</xs:documentation>
  27. </xs:annotation>
  28. <xs:simpleType name="T_id">
  29. <xs:restriction base="xs:int"></xs:restriction>
  30. </xs:simpleType>
  31. <xs:element name="Persons">
  32. <xs:complexType>
  33. <xs:sequence>
  34. <xs:element name="Person" maxOccurs="unbounded" type="tns:T_Person"/>
  35. </xs:sequence>
  36. </xs:complexType>
  37. </xs:element>
  38. <xs:complexType name="T_Person">
  39. <xs:sequence>
  40. <xs:element name="Name" type="tns:T_Name" />
  41. <xs:element name="Age" type="tns:T_Age" />
  42. </xs:sequence>
  43. <xs:attribute name="id" type="tns:T_id" use="required" />
  44. </xs:complexType>
  45. </xs:schema>

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

[csharp]view plaincopyprint?

  1. /// <summary>
  2. /// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示
  3. /// </summary>
  4. /// <param name="xmlFile">xml文件</param>
  5. /// <param name="xsdFile">xsd文件</param>
  6. /// <param name="namespaceUrl">命名空间,无则默认为null</param>
  7. /// <returns></returns>
  8. public static string XmlValidationByXsd(string xmlFile, string xsdFile, string namespaceUrl = null)
  9. {
  10. StringBuilder sb = new StringBuilder();
  11. XmlReaderSettings settings = new XmlReaderSettings();
  12. settings.ValidationType = ValidationType.Schema;
  13. settings.Schemas.Add(namespaceUrl, xsdFile);
  14. settings.ValidationEventHandler += (x,y)=>
  15. {
  16. sb.AppendFormat("{0}|", y.Message);
  17. };
  18. using (XmlReader reader = XmlReader.Create(xmlFile, settings))
  19. {
  20. try
  21. {
  22. while (reader.Read());
  23. }
  24. catch (XmlException ex)
  25. {
  26. sb.AppendFormat("{0}|", ex.Message);
  27. }
  28. }
  29. return sb.ToString();
  30. }

2013-10-17备注

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

[csharp]view plaincopyprint?

  1. /// <summary>
  2. /// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示
  3. /// </summary>
  4. /// <param name="xmlText">xml文本内容</param>
  5. /// <param name="schemaFile">xsd文件</param>
  6. /// <returns></returns>
  7. public static string XmlValidateByXsd(string xmlText, string schemaFile)
  8. {
  9. StringBuilder sb = new StringBuilder();
  10. XmlReaderSettings settings = new XmlReaderSettings();
  11. settings.ValidationType = ValidationType.Schema;
  12. settings.Schemas.Add(null, schemaFile);
  13. settings.ValidationEventHandler += (x, y) =>
  14. {
  15. sb.AppendFormat("{0}\n", y.Message);
  16. };
  17. using (XmlReader reader = XmlReader.Create(new StringReader(xmlText), settings))
  18. {
  19. try
  20. {
  21. while (reader.Read()) ;
  22. }
  23. catch (XmlException ex)
  24. {
  25. sb.AppendFormat("{0}\n", ex.Message);
  26. }
  27. }
  28. return sb.ToString();
  29. }

原文地址:http://blog.csdn.net/gdjlc/article/details/11374787