XML Schema使用 XML 语法

一、XML Schema的简介:

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 可描述 XML 文档的结构。

XML Schema 语言也可作为 XSD(XML Schema Definition)来被引用。

 

XML Schema 比 DTD 更强大。XML Schema 支持数据类型。

XML 编写 XML Schema 有很多好处:

1.不必学习新的语言

2.可使用 XML 编辑器来编辑 Schema 文件

3.可使用 XML 解析器来解析 Schema 文件

4.可通过 XML DOM 来处理 Schema

5.可通过 XSLT 来转换 Schema

二、案例

XML 文档note.xml

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><?xml version=”1.0″   encoding=”UTF-8″?>
  2. <note>
  3. <to>小梅</to>
  4. <from>羽婷</from>
  5. <heading>语句</heading>
  6. <body>XXXXX</body>
  7. </note></span>

note.xml的DTD约束文件

 

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><!ELEMENT note (to, from, heading, body)>
  2. <!ELEMENT to (#PCDATA)>
  3. <!ELEMENT from (#PCDATA)>
  4. <!ELEMENT heading (#PCDATA)>
  5. <!ELEMENT body (#PCDATA)></span>

note.xsd” 的 XML Schema 约束文件

 

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><?xml version=”1.0″  encoding=”UTF-8″?>
  2. <xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”
  3. targetNamespace=”http://www.w3school.com.cn”
  4. xmlns=”http://www.w3school.com.cn”<!–xmlns和targetNamespace地址一样 –>
  5. elementFormDefault=”qualified”>
  6. <!–elementFormDefault指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。xs规定了来自命名空间的前缀。 –>
  7. <xs:element name=”note”>
  8.     <xs:complexType>
  9.       <xs:sequence>
  10.     <xs:element name=”to” type=”xs:string”/>
  11.     <xs:element name=”from” type=”xs:string”/>
  12.     <xs:element name=”heading” type=”xs:string”/>
  13.     <xs:element name=”body” type=”xs:string”/>
  14.       </xs:sequence>
  15.     </xs:complexType>
  16. </xs:element>
  17. </xs:schema></span>

对 DTD 的引用

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><?xml version=”1.0″  encoding=”UTF-8″?>
  2. <!DOCTYPE note SYSTEM
  3. “http://www.w3school.com.cn/dtd/note.dtd”>
  4. <note>
  5. <to>vvvv</to>
  6. <from>Jani</from>
  7. <heading>Reminder</heading>
  8. <body>Don’t forget me this weekend!</body>
  9. </note></span>

对 XML Schema 的引用

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><?xml version=”1.0″  encoding=”UTF-8″?>
  2. <note
  3. xmlns=”http://www.w3school.com.cn”
  4. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
  5. xsi:schemaLocation=”http://www.w3school.com.cn  note.xsd”>
  6. <!–<schema> 元素是每一个 XML Schema 的根元素。 –>
  7. <to>Tove</to>
  8. <from>Jani</from>
  9. <heading>Reminder</heading>
  10. <body>Don’t forget me this weekend!</body>
  11. </note></span>
[html][/html] view plaincopy

  1. <pre name=”code” class=”html” style=”background-color:rgb(255,255,255)”><span style=”font-weight:normal”><span style=”font-size:32px”>定义简易元素的语法:</span></span><pre name=”code” class=”html”><span style=”font-size:24px; font-weight:normal”><xs:element name=”color” type=”xs:string” default=”red”/>//默认值
  2. <xs:element name=”color” type=”xs:string” fixed=”red”/>//固定值</span></pre></pre>
[html][/html] view plaincopy

  1. <span style=”font-size:24px”><xs:element name=”lastname” type=”xs:string”/><!–最常用的类型
  2. xs:string
  3. xs:decimal
  4. xs:integer
  5. xs:boolean
  6. xs:date
  7. xs:time
  8.  –>
  9. <xs:element name=”age” type=”xs:integer”/>
  10. <xs:element name=”dateborn” type=”xs:date”/> </span>

XSD 属性

定义属性的语法是:<xs:attribute name=”xxx” type=”yyy”/>

属性的默认值和固定值

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><xs:attribute name=”lang” type=”xs:string” default=”EN”/>
  2. <xs:attribute name=”lang” type=”xs:string” fixed=”EN”/></span>

 

可选的和必需的属性在缺省的情况下,属性是可选的。如需规定属性为必选,使用 “use” 属性

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><xs:attribute name=”lang” type=”xs:string” use=”required”/></span>

 

XSD 限定 / Facets

 

[html][/html] view plaincopy

  1. <xs:element name=”age”><!–age 的值不能低于 0 或者高于 120–>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:integer”>
  4.     <xs:minInclusive value=”0″/>
  5.     <xs:maxInclusive value=”120″/>
  6.   </xs:restriction>
  7. </xs:simpleType>
  8. </xs:element>

[html][/html] view plaincopy

  1. <xs:element name=”car”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:enumeration value=”Audi”/><!–使用枚举约束(enumeration constraint)–>
  5.     <xs:enumeration value=”Golf”/>
  6.     <xs:enumeration value=”BMW”/>
  7.   </xs:restriction>
  8. </xs:simpleType>
  9. </xs:element>

[html][/html] view plaincopy

  1. <xs:element name=”letter”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:pattern value=”[a-z]”/><!–使用模式约束(pattern constraint)–>
  5.   </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

 

对空白字符的限定

whiteSpace 限定被设置为 “preserve”——> XML 处理器不会移除任何空白字符:

 

[html][/html] view plaincopy

  1. <span style=”font-size:24px”><xs:element name=”address”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:whiteSpace value=”preserve”/>
  5.   </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element></span>

 

whiteSpace 限定被设置为 “replace”——>XML处理器将移除所有空白字符(换行、回车、空格以及制表符):

[html][/html] view plaincopy

  1. <xs:element name=”address”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:whiteSpace value=”replace”/>
  5.   </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

whiteSpace 限定被设置为 “collapse”——>XML处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):

[html][/html] view plaincopy

  1. <xs:element name=”address”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:whiteSpace value=”collapse”/>
  5.   </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

其值最小为 5 个字符,最大为 8 个字符

 

[html][/html] view plaincopy

  1. <xs:element name=”password”>
  2. <xs:simpleType>
  3.   <xs:restriction base=”xs:string”>
  4.     <xs:minLength value=”5″/>
  5.     <xs:maxLength value=”8″/>
  6.   </xs:restriction>
  7. </xs:simpleType>
  8. </xs:element>

 

复合元素,”food”,仅包含文本:

<food type=”dessert”>Ice cream</food>

复合元素,”description”,包含元素和文本:

<description>

It happened on <date lang=”norwegian”>03.03.99</date> ….

</description>

定义复合元素:

” employee” 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:

[html][/html] view plaincopy

  1. <xs:element name=”employee” type=”personinfo”/>
  2. <xs:complexType name=”personinfo”>
  3.   <xs:sequence>
  4.     <xs:element name=”firstname” type=”xs:string”/>
  5.     <xs:element name=”lastname” type=”xs:string”/>
  6.   </xs:sequence>
  7. </xs:complexType>

定义无内容的类型就必须声明一个在其内容中只能包含元素的类型

[html][/html] view plaincopy

  1. <xs:element name=”product”>
  2.   <xs:complexType>
  3.     <xs:complexContent>
  4.       <xs:restriction base=”xs:integer”>
  5.         <xs:attribute name=”prodid” type=”string”/>
  6.       </xs:restriction>
  7.     </xs:complexContent>
  8.   </xs:complexType>
  9. </xs:element>

声明了一个复合类型,其内容被定义为整数值,并且 “shoesize” 元素含有名为 “country” 的属性:

[html][/html] view plaincopy

  1. <xs:element name=”shoesize”>
  2.   <xs:complexType>
  3.     <xs:simpleContent>
  4.       <xs:extension base=”xs:integer”>
  5.         <xs:attribute name=”country” type=”xs:string” />
  6.       </xs:extension>
  7.     </xs:simpleContent>
  8.   </xs:complexType>
  9. </xs:element>

为了使字符数据可以出现在 “letter” 的子元素之间,mixed 属性必须被设置为 “true

[html][/html] view plaincopy

  1. <xs:element name=”letter”>
  2.   <xs:complexType mixed=”true”>
  3.     <xs:sequence>
  4.       <xs:element name=”name” type=”xs:string”/>
  5.       <xs:element name=”orderid” type=”xs:positiveInteger”/>
  6.       <xs:element name=”shipdate” type=”xs:date”/>
  7.     </xs:sequence>
  8.   </xs:complexType>
  9. </xs:element>

XSD类型指示器

 

对于所有的 “Order” 和 “Group” 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。如需使某个元素的出现次数不受限制,使用 maxOccurs=”unbounded” .

All 指示器

<all> 指示器可规定子元素以何种顺序出现,以及每个子元素须出现几次:

[html][/html] view plaincopy

  1. <xs:element name=”person”>
  2.   <xs:complexType>
  3.     <xs:all>
  4.       <xs:element name=”firstname” type=”xs:string”/>
  5.       <xs:element name=”lastname” type=”xs:string”/>
  6.     </xs:all>
  7.   </xs:complexType>
  8. </xs:element>

Choice 指示器

<choice> 指示器可规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

[html][/html] view plaincopy

  1. <xs:element name=”person”>
  2.   <xs:complexType>
  3.     <xs:choice>
  4.       <xs:element name=”employee” type=”employee”/>
  5.       <xs:element name=”member” type=”member”/>
  6.     </xs:choice>
  7.   </xs:complexType>
  8. </xs:element>

Sequence 指示器

[html][/html] view plaincopy

  1. <xs:element name=”person”>
  2.   <xs:complexType>
  3.     <xs:sequence><!–<span style=”font-size:18px”>规定子元素必须按照特定的顺序出现–></span>
  4.       <xs:element name=”firstname” type=”xs:string”/>
  5.       <xs:element name=”lastname” type=”xs:string”/>
  6.     </xs:sequence>
  7.   </xs:complexType>
  8. </xs:element>

把 group 定义完毕以后,就可以在另一个定义中引用它了

[html][/html] view plaincopy

  1. <xs:group name=”persongroup”>
  2.   <xs:sequence>
  3.     <xs:element name=”firstname” type=”xs:string”/>
  4.     <xs:element name=”lastname” type=”xs:string”/>
  5.     <xs:element name=”birthday” type=”xs:date”/>
  6.   </xs:sequence>
  7. </xs:group>
[html][/html] view plaincopy

  1. <xs:element name=”person” type=”personinfo”/>
  2. <xs:complexType name=”personinfo”>
  3.   <xs:sequence>
  4.     <xs:group<span style=”color:#cc0000″> ref=”persongroup”</span>/>
  5.     <xs:element name=”country” type=”xs:string”/>
  6.   </xs:sequence>
  7. </xs:complexType>

XSD <any> 元素

 

[html][/html] view plaincopy

  1. <xs:element name=”person”>
  2.   <xs:complexType>
  3.     <xs:sequence>
  4.       <xs:element name=”firstname” type=”xs:string”/>
  5.       <xs:element name=”lastname” type=”xs:string”/>
  6.       <xs:any minOccurs=”0″/>
  7.     </xs:sequence>
  8.   </xs:complexType>
  9. </xs:element>

 

XSD <anyAttribute> 元素

通过使用 <anyAttribute> 元素可以向 “person” 元素添加任意数量的属性:

[html][/html] view plaincopy

  1. <xs:element name=”person”>
  2.   <xs:complexType>
  3.     <xs:sequence>
  4.       <xs:element name=”firstname” type=”xs:string”/>
  5.       <xs:element name=”lastname” type=”xs:string”/>
  6.     </xs:sequence>
  7.  <span style=”color:#009900″>   <xs:anyAttribute/></span>
  8.   </xs:complexType>
  9. </xs:element>

XSD 元素替换(Element Substitution)

[html][/html] view plaincopy

  1. <xs:element name=”name” type=”xs:string”/>
  2. <xs:element name=”navn” substitutionGroup=”name”/>

阻止元素替换

为防止其他的元素替换某个指定的元素,请使用 block 属性

[html][/html] view plaincopy

  1. <xs:element name=”name” type=”xs:string” block=”substitution”/>

在某个 schema 中规格化字符串数据类型的例子

[html][/html] view plaincopy

  1. <xs:element name=”customer” type=”xs:normalizedString”/>

schema 中日期时间声明的例子:

[html][/html] view plaincopy

  1. <xs:element name=”startdate” type=”xs:dateTime”/>

scheme 中十进制数声明的例子

[html][/html] view plaincopy

  1. <xs:element name=”prize” type=”xs:decimal”/>

标签