XML Schema
一、简介
XML Schema是用来描述XML文档结构的,本身也是使用XML文档结构,所以不需要重新学习一门语言,与DTD出于同样的目的产生,但是功能更为强大。功能如下:
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
范例:定义note.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
首先解释一下complexType:note是由(to, from, heading, body)组成的,所以是符合类型,在上面可以看到符合类型元素的定义方式
XML文档引用XSD文档的使用:
<?xml version="1.0"?> <note xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3school.com.cn note.xsd"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
下面一一解释文档的内容,请读者不吝赐教:
针对XSD文档有:
1.<schema>是每个XML Schema的根元素
2.<schema>可以包含属性,下面谈这些属性(主要是命名空间的问题)
a.xmlns:xs="http://www.w3.org/2001/XMLSchema":这是每个XML Schema文档必须有的,显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:,很明显,该命名空间定义了很多XML Schema文档所达成共识的元素;
b.targetNamespace="http://www.w3school.com.cn":这个是用来本XML Schema文档中的元素是属于什么命名空间的,在这里,显示被此 schema 定义的元素 (note, to, from, heading, body), 来自命名空间: "http://www.w3school.com.cn",指出默认的命名空间是 "http://www.w3school.com.cn";
c.elementFormDefault="qualified":
该属性有两个可选值:
"qualified":实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace。
"unqualified":实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。
具体解释如下:选值为qualified,表明指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。范例如下:
<?xml version="1.0" encoding="UTF-8"?>
<school:SCHOOL
xmlns:school="http://szl.com/shema/school.xsd"
xmlns:class="http://szl.com/shema/class.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://szl.com/shema/school.xsd school.xsd">
<school:Grade>
<class:Class>
<class:Student>
<class:Name>zhangsan</class:Name>
<class:Age>24</class:Age>
</class:Student>
</class:Class>
</school:Grade>
</school:SCHOOL>
以上两个XSD文件均将elementFormDefault设为qualified,则使用这两个XSD文件创建XML文档实例的时候,必须 作如上标志为红色部分的声明,只有这样,才能在文档中使用XML Schema文档定义的元素时用Schema XML文档定义的targetNameSpace命名空间去限定本XML文档的元素。(以上红色部分等号后面的命名空间就是XSD文件中定义的targetNameSpace)
针对XML文档有:
1.xmlns="http://www.w3school.com.cn":规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。
2.一旦您拥有了可用的 XML Schema 实例命名空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"您就可以使用 schemaLocation 属性了(注:实例命名空间的使用方法一般如此声明)此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:xsi:schemaLocation="http://www.w3school.com.cn note.xsd", 模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配;
二、内容
1.元素
普通定义范例:<xs:element name="lastname" type="xs:string"/>
缺省定义范例:<xs:element name="color" type="xs:string" default="red"/>当没有其他的值被规定时,默认值就会自动分配给元素。
固定定义范例:<xs:element name="color" type="xs:string" fixed="red"/>固定值同样会自动分配给元素,并且您无法规定另外一个值。
2.属性
定义方式类似于元素,只是将<xs:element>换为<xs:attribute>
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:<xs:attribute name="lang" type="xs:string" use="required"/>
3.XSD限定/Facets
详细见:http://www.w3school.com.cn/schema/schema_facets.asp
4.复合元素(总共四种)
范例:
<description> It happened on <date lang="norwegian">03.03.99</date> .... </description>
定义复合元素的两种方式:
第一种:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
第二种:这种方式可以使你在多处使用该类型
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
在某个复合元素基础之上再添加元素:
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
5.指示器:详情请见:http://www.w3school.com.cn/schema/schema_complex_indicators.asp
6.<any>元素:详情请见:http://www.w3school.com.cn/schema/schema_complex_any.asp
7.<anyAttribute>元素:http://www.w3school.com.cn/schema/schema_complex_anyattribute.asp
以上很多内容来自网站:http://www.w3school.com.cn
补充:
C#下对XML文档使用XSD进行验证的核心代码:
static void Main(string[] args)
{
XmlReaderSettings st = new XmlReaderSettings();
st.ValidationType = ValidationType.Schema;
//读取xsd文件,以下表示方式表明在工程文件夹下面找到该文件
st.Schemas.Add(null, @"..\..\my.xsd");
//设置验证xml出错时的事件
st.ValidationEventHandler += (obj, e) =>
{
Console.WriteLine("The method or operation is not implemented.");
};
XmlReader xr = XmlReader.Create(@"..\..\test.xml", st);
while (xr.Read())
{
if (xr.NodeType == XmlNodeType.Text){
Console.WriteLine(xr.Value);
}
}
xr.Close();
Console.ReadLine();
}

浙公网安备 33010602011771号