XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证X
发布时间:2020-12-16 05:19:30 所属栏目:百科 来源:网络整理
导读:XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大。 作用有: ①定义可出现在文档中的元素 ②定义可出现在文档中的属性 ③定义哪个元素是子元素 ④定义子元素的次序 ⑤定义子
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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |