XSD浅学笔记II

XSD浅学笔记II

2006 8 23 星期三

XSD 浅学笔记

 

简单明快的 XSD 的入门笔记,希望能让你和我一样,用半天时间步入第一道门槛。

这一片记录基础知识,第二篇会是些进阶知识和总结,然后你就可以写出自己的第一个 XSD 文档,并用来验证一个 XML 文档了。

 

Any 元素

如同其名字那样,这个元素就是可以替代任何元素,相当于一个占位符,给予了 xsd 文件一个扩展的空间。

 

<xs:element name="person">

  <xs:complexType>

    <xs:sequence>

      <xs:element name="firstname" type="xs:string"/>

      <xs:element name="lastname" type="xs:string"/>

      <xs:any minOccurs="0"/>

    </xs:sequence>

  </xs:complexType>

</xs:element>

 

在上面的 xsd 里我们放置了 any 元素,给了 minOccurs 指示符,然后再看下面这个元素类型:

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.w3schools.com"

xmlns="http://www.w3schools.com"

elementFormDefault="qualified"><xs:element name="children">

  <xs:complexType>

    <xs:sequence>

      <xs:element name="childname" type="xs:string"

      maxOccurs="unbounded"/>

    </xs:sequence>

  </xs:complexType>

</xs:element></xs:schema>

 

将上面的元素放置到 any 的位置里,将是合法的:

 

<?xml version="1.0" encoding="ISO-8859-1"?><persons xmlns="http://www.microsoft.com"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:SchemaLocation="http://www.microsoft.com family.xsd

http://www.w3schools.com children.xsd"><person>

<firstname>Hege</firstname>

<lastname>Refsnes</lastname>

<children>

        <childname>Cecilie</childname>

</children>

</person>

<person>

<firstname>Stale</firstname>

<lastname>Refsnes</lastname>

</person>

</persons>

 

同样的还有 anyAttribute 标记,对应的是属性的占位符。用法是类似的。

 

元素替换

有时候我们需要让某个位置的元素的名字可以换成另外一个,这个时候用元素替换,看下例:

<xs:element name="name" type="xs:string"/>

<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">

  <xs:sequence>

    <xs:element ref="name"/>

  </xs:sequence>

</xs:complexType>

<xs:element name="customer" type="custinfo"/>

<xs:element name="kunde" substitutionGroup="customer"/>

 

使用 subsitutionGroup 以及要替换的元素的名字,那么就可以使得下面的 xml 是合法的:

<customer>

  <name>John Smith</name>

</customer>

<kunde>

  <navn>John Smith</navn>

</kunde>

 

如果你确认某个元素绝对不想被替换,也可以声明这一点,用 block

<xs:element name="name" type="xs:string" block="substitution"/>

<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">

  <xs:sequence>

    <xs:element ref="name"/>

  </xs:sequence>

</xs:complexType>

<xs:element name="customer" type="custinfo" block="substitution"/>

<xs:element name="kunde" substitutionGroup="customer"/>

 

上面的声明将使得:

<kunde>

  <navn>John Smith</navn>

</kunde>

会是非法的。

 

http://www.w3schools.com/schema/schema_example.asp

 

 

写一个 XSD 文档

 

就象写一份 xml 文档一样,首先声明根元素为 schema ,给予名称空间等等。

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">......

 

 

</xs:schema>

 

接下来就是把你前面所学的,关于定义元素和类型的知识应用进来,写一份简单快捷的 xsd ,例如下面的这一份:

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">

 <xs:complexType>

  <xs:sequence>

   <xs:element name="orderperson" type="xs:string"/>

   <xs:element name="shipto">

    <xs:complexType>

     <xs:sequence>

      <xs:element name="name" type="xs:string"/>

      <xs:element name="address" type="xs:string"/>

      <xs:element name="city" type="xs:string"/>

      <xs:element name="country" type="xs:string"/>

     </xs:sequence>

    </xs:complexType>

   </xs:element>

   <xs:element name="item" maxOccurs="unbounded">

    <xs:complexType>

     <xs:sequence>

      <xs:element name="title" type="xs:string"/>

      <xs:element name="note" type="xs:string" minOccurs="0"/>

      <xs:element name="quantity" type="xs:positiveInteger"/>

      <xs:element name="price" type="xs:decimal"/>

     </xs:sequence>

    </xs:complexType>

   </xs:element>

  </xs:sequence>

  <xs:attribute name="orderid" type="xs:string" use="required"/>

 </xs:complexType>

</xs:element>

</xs:schema>

 

稍微要注意的是 attribute 必须出现在一个 complexType 的最后位置,先元素,后属性。

 

这样的文档完全可行,但会有些难读,再次利用重构的方法,把简单元素,属性,复合元素分别独立出来,再用引用标记 ref 来组合:

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

 

<!-- definition of simple elements -->

<xs:element name="orderperson" type="xs:string"/>

<xs:element name="name" type="xs:string"/>

<xs:element name="address" type="xs:string"/>

<xs:element name="city" type="xs:string"/>

<xs:element name="country" type="xs:string"/>

<xs:element name="title" type="xs:string"/>

<xs:element name="note" type="xs:string"/>

<xs:element name="quantity" type="xs:positiveInteger"/>

<xs:element name="price" type="xs:decimal"/>

 

<!-- definition of attributes -->

<xs:attribute name="orderid" type="xs:string"/>

 

<!-- definition of complex elements -->

<xs:element name="shipto">

 <xs:complexType>

  <xs:sequence>

   <xs:element ref="name"/>

   <xs:element ref="address"/>

   <xs:element ref="city"/>

   <xs:element ref="country"/>

  </xs:sequence>

 </xs:complexType>

</xs:element>

<xs:element name="item">

 <xs:complexType>

  <xs:sequence>

   <xs:element ref="title"/>

   <xs:element ref="note" minOccurs="0"/>

   <xs:element ref="quantity"/>

   <xs:element ref="price"/>

  </xs:sequence>

 </xs:complexType>

</xs:element>

<xs:element name="shiporder">

 <xs:complexType>

  <xs:sequence>

   <xs:element ref="orderperson"/>

   <xs:element ref="shipto"/>

   <xs:element ref="item" maxOccurs="unbounded"/>

  </xs:sequence>

  <xs:attribute ref="orderid" use="required"/>

 </xs:complexType>

</xs:element>

</xs:schema>

 

这样看起来清晰很多,而且方便修改和复用。

更进一步的,把类型独立出来,给予名字,这样所有的元素都直接复用类型:

 

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

 

<xs:simpleType name="stringtype">

 <xs:restriction base="xs:string"/>

</xs:simpleType>

 

<xs:simpleType name="inttype">

 <xs:restriction base="xs:positiveInteger"/>

</xs:simpleType>

 

<xs:simpleType name="dectype">

 <xs:restriction base="xs:decimal"/>

</xs:simpleType>

 

<xs:simpleType name="orderidtype">

 <xs:restriction base="xs:string">

  <xs:pattern value="[0-9]{6}"/>

 </xs:restriction>

</xs:simpleType>

 

<xs:complexType name="shiptotype">

 <xs:sequence>

  <xs:element name="name" type="stringtype"/>

  <xs:element name="address" type="stringtype"/>

  <xs:element name="city" type="stringtype"/>

  <xs:element name="country" type="stringtype"/>

 </xs:sequence>

</xs:complexType>

 

<xs:complexType name="itemtype">

 <xs:sequence>

  <xs:element name="title" type="stringtype"/>

  <xs:element name="note" type="stringtype" minOccurs="0"/>

  <xs:element name="quantity" type="inttype"/>

  <xs:element name="price" type="dectype"/>

 </xs:sequence>

</xs:complexType

 

><xs:complexType name="shipordertype">

 <xs:sequence>

  <xs:element name="orderperson" type="stringtype"/>

  <xs:element name="shipto" type="shiptotype"/>

  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>

 </xs:sequence>

 <xs:attribute name="orderid" type="orderidtype" use="required"/>

</xs:complexType>

 

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

 

好了,现在你可以自己动手开始写自己的 xsd 了。如果遇到问题,可以到这份东西的英文原出处仔细弄个究竟:

http://www.w3schools.com/schema/default.asp

 

全篇完。

你可能感兴趣的:(XSD浅学笔记II)