加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:59:13 所属栏目:百科 来源:网络整理
导读:转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大。 作用有: ①定义可出现在文档中的元素 ②定义可出

转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html

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

?

实例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();
???????? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读