`

XML schema简介

 
阅读更多

XML schema简介

 

schema是DTD的替代物,比DTD功能更强大,用来约束,定义xml的元素.

 

DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Schema呢。

因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出更细致的语义限制。

其实细心的人会发现,在DTD中,只有一个数据类型,就是PCDATA(用在元素中)和CDATA(用在属性中),

在里面写日期也行,数字还行,字符更是没问题。而Schema正是针对这些DTD的缺点而设计的,

Schema是完全使用XML作为描述手段,具有很强的描述能力,扩展能力和处理维护能力等。

 

schema文件以.xsd为后缀名,符合xml文件格式,根标签为<schema>,一般使用命名空间.

 

比如,有一个xml文件

customer.xml

------------

<customer>
  <name>teiki</name>
  <address>No.237, Road Waitan, Shanghai</address>
</customer>

 可以使用下面的customer.xsd文件约束,

 

schema标签名字使用了xsd的命名空间,

xsd命名空间定义为 xmlns:xsd="http://www.w3.org/2001/XMLSchema"

customer.xsd

-------------

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="customer">
     <xsd:complexType>
       <xsd:sequence>
          <xsd:element name="name" type="xsd:string"/>
          <xsd:element name="address" type="xsd:string" />
       </xsd:sequence>
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

 说明:

实例文档customer.xml中,<customer>元素含有两个子元素,在Schema中凡是有两个以上的子元素,就认为是复杂类型的,

所以我们在Schema文档中采用ComplexType来定义该元素。表示有多个XML子元素。

sequence表示子元素依次出现的顺序。

如果有多层子元素怎么办呢,同样的道理,有几层写几层,一直往下嵌就OK了,

这里我要说的是另一种方法,结构看上去会清晰一些。

 

address.xml

---------------

<customer>
  <name>Teiki</name>
  <address>
    <!-- address追加一个地址子元素 -->
    <prefecture>Zhejiang</prefecture>
    <city>Hangzhou</city>
    <street>Xilu Road, No.121, 7F</street>
  </address>
</customer>

 下面就是采用ref元素来编写的这个Schema文档:

address2.xsd

----------------------

<?xm l version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="customer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="name" type="xsd:string"/>
        <!-- 使用ref引用下面定义的address -->
        <xsd:element ref="address"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="address">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="prefecture" type="xsd:string"/>
        <xsd:element name="city" type="xsd:string" />
        <xsd:element name="street" type="xsd:string" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

 如果按正常的写法,应该把13-21行的内容替换到每8行去,

但这里使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。

 

如果元素中包含属性怎么办呢?一样简单,只要在定义完子元素的后面再着定义属性就行了。

定义属性用“attribute”,还是举个例子吧

 

 

customer2.xml

---------------

<customer id="001718">
  <name>Teiki</name>
  <address>No.237, Road Waitan, Shanghai</address>
</customer>

 这个例子和上面的一个例子差不多,只是在元素customer中设了一个属性id。

 

customer2.xsd

------------------

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="customer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="name" type="xsd:string"/>
        <xsd:element name="address" type="xsd:string" />
      </xsd:sequence>
      <!-- 增加属性定义 -->
      <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

 说明:

需要注意的一点是,属性和元素不是一家的,所以要把它放在sequence外面写,

但它们都在customer的孩子,所以要写在complexType的里面。

 

下面再看一个例子:

temp.xsd

----------------------

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="order">
    <xsd:complexType>
      <xsd:sequence>
        <!--maxOccurs代表:相同元素最多出现的次数,与此相反的是minOccurs代表:出现的最少次数。-->
        <xsd:element ref="orderItem" maxOccurs="10"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="orderItem">
    <xsd:complexType>
      <xsd:sequence>
        <!-- choice代表:可选的元素,也就是在这里面写的元素只能选其中之一,不能全写。 -->
        <xsd:choice>
          <xsd:element name="id" type="idType"/>
          <xsd:element name="name" type="xsd:string"/>
        </xsd:choice>
        <xsd:element name="quantity" type="quantityType"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  
  <!-- simpleType代表自定义数据类型,也就是name里的并不是真正的数据类型,而是根据自己的意愿定制的。 -->
  <xsd:simpleType name="idType">
    <!-- restriction代表对某一数据类型做约束,也就是只能取其中范围之内符合要求的 -->
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="7-5058-3496-7"/>
      <xsd:enumeration value="7-5005-6450-3"/>
      <xsd:enumeration value="7-3020-6069-7"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="quantityType">
    <xsd:restriction base="xsd:integer">
      <xsd:minInclusive value="1"/>
      <xsd:maxInclusive value="10"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

 上面的例子中,maxOccurs代表:相同元素最多出现的次数,与此相反的是minOccurs代表:出现的最少次数。

默认情况下两个都为“1”,如果把minOccurs设为“0”,表示该元素可有可无。

choice代表:可选的元素,也就是在这里面写的元素只能选其中之一,不能全写。

simpleType代表自定义数据类型,也就是name里的并不是真正的数据类型,而是根据自己的意愿定制的。

restriction代表对某一数据类型做约束,也就是只能取其中范围之内符合要求的,

比如第25-29行中,里面又有个元素enumeration代表枚举,

也就是只能在枚举的那几个中选一个,而下在的36-36行,

里面又有一对元素minInclusive和maxInclusive代表类型的取值范围,

也就是只能取大于等于minInclusive并且小于等于maxInclusive的数。

 

把这个Schema用在XML中是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:/ProgramCode/Year2/XML/practice/temp.xsd">
  <orderItem>
    <id>7-5005-6450-3</id>
    <quantity>3</quantity>
  </orderItem>
  
  <orderItem>
    <name>xyb</name>
    <quantity>3</quantity>
  </orderItem>
  
  <!-- 注意下面这个是错的,因为超出了规定的范围 quantityType取值为1-10 -->
  <orderItem>
    <id>7-5005-6450-3</id>
    <quantity>13</quantity>
  </orderItem>
  <!? 从上面的注释到此,是错误的 -->
</order>

 说明:

红色的部分是导入Schema的命令,绿色的是Schema文件的路径,如果用XMLSPY写时,会自动加上。

 

对属性的设置,基本上和元素的差不多。比如:

<xsd:element name="orderItem">
  <xsd:complexType>
    <xsd:sequence></xsd:sequence>
    <xsd:attribute name="id" type="idType" use="required"/>
    <xsd:attribute name="quantity" type="xsd:integer" default="1"/>
  </xsd:complexType>
  
  <xsd:simpleType name="idType">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="/d{1}-/d{4}-/d{4}-/d{1}"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

 这里我们讲id属性类型作为一种自定义数据类型idType。它的格式就是上面用到的也就是类似于“7-5005-6450-3”样的。

而且,用attribute元素的use属性来定义是否是必须的属性。

required是必须值,optional是可选值,prohibited是无属性值。default属性是默认值。

 

参考:  http://www-128.ibm.com/developerworks/cn/xml/xml-schema/index.html

分享到:
评论

相关推荐

    XML与XMLSchema

    XML发展历史概述 XML文档组成元素 XML Schema组成元素 XML相关API

    理解XML Schema XML Schema进阶

    理解XML Schema XML Schema进阶

    XML Schema教程

    XML Schema 教程 XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 在此教程中,你将学习如何在应用程序中读取和...

    XML Schema简明教程-W3C.rar

    XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 在此教程中,你将学习如何在应用程序中读取和创建 XML ...

    XmlSchema-1.1.jar

    XmlSchema-1.1.jar XmlSchema-1.1.jar

    XML文件XML Schema.docXML Schema.doc

    XML文件XML Schema.docXML Schema.doc

    xmlschema-core-2.1.0-API文档-中文版.zip

    赠送jar包:xmlschema-core-2.1.0.jar; 赠送原API文档:xmlschema-core-2.1.0-javadoc.jar; 赠送源代码:xmlschema-core-2.1.0-sources.jar; 赠送Maven依赖信息文件:xmlschema-core-2.1.0.pom; 包含翻译后的API...

    XmlSchema-1.4.7 jar包

    好不容易找到的XmlSchema-1.4.7 jar包,需要的同学速度下载吧。不黑心,只要1分~~~

    xmlschema-core-2.0.3.jar

    xmlschema-core-2.0.3.jar;xmlschema-core-2.0.3.jar;xmlschema-core-2.0.3.jar

    XmlSchema-1.2.jar,xmlschema-1.2.jar,xml.jar

    XmlSchema-1.2.jar,xmlschema-1.2.jar,xml.jar

    xmlschema-core-2.0.jar

    cxf jar xmlschema-core-2.0.jar

    XmlSchema标准参考手册.chm

    XML Schema是以XML语言为基础的,它用于可替代DTD。 一份XML schema文件描述了XML文档的结构。 XML Schema语言也被称为XML Schema Definition (XSD)(XML Schema定义). --------------------------------------...

    XML Schema 的简介

    这个文件介绍了XML Schema 的相关技术,是学习语义网技术的很好的资料。

    一个简单的XML Schema的例子

    Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。这就方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具...

    xml schema 的使用

    xml schema 的使用xml schema 的使用xml schema 的使用xml schema 的使用

    XmlSchema-1.4.2

    XmlSchema-1.4.2 XmlSchema-1.4.2

    XML Schema 教程(word版本)

    XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 在此教程中,你将学习如何在应用程序中读取和创建 XML ...

    XML Schema xsd XML Schema xsd

    XML Schema xsdXML Schema xsdXML Schema xsdXML Schema xsd

    XMLSchema经典例题

    这个是XMLSchema的经典例子 里面详细有Schema的各种用法

Global site tag (gtag.js) - Google Analytics