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 >?
- <?xml version="1.0" encoding="UTF-8"?>
- <Persons>
- <Person >
- <Name>李四</Name>
- <Age>20</Age>
- </Person>
- </Persons>
Persons.xsd
[html]view plaincopyprint?
- <?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
[html]view plaincopyprint?
- <?xml version="1.0" encoding="UTF-8"?>
- <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem">
- <Person >
- <Name>李四</Name>
- <Age>20</Age>
- </Person>
- </Persons>
Persons2.xsd
[html]view plaincopyprint?
- <?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文件格式
[csharp]view plaincopyprint?
- /// <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字符串,则可用下面:
[csharp]view plaincopyprint?
- /// <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();
- }
- 上一篇 »Java XML Schema详解
- 下一篇 »JavaScript 中JSON