xml 学习笔记 3.xml Schema
XML Scema:XML模式语言,用来描述XML结构、数据内容、相关约束等方面特征的语言。 与dtd相比,XML Scema的优点:一致性,XML Scema是一种XML文档,从而使XML模式与实例定义达到统一;完备性,XML Scema引入数据类型、命名空间,并且支持对其他XML Scema的引用;规范性和准确性,XML Scema使用更加规范和完备的机制来约束XML文档;面向对象:XML Scema使用了面向对象的机制,使应用起来更加灵活;扩展性,XML Scema提供一些扩展机制(open),允许在事先无法准确描述数据模式的情况下,在 XML 实例数据中根据需要添加相关的数据。
xsd:annotation 元素来增加注释内容,xsd:annotation 元素可以包含两个子元素 xs:appinfo 和 xs:documentation。前者用于表示计算机应用程序处理的注释,而后者则表示供开发人员阅读的注释。
XML Scema中的数据类型实际上主要是针对XML元素而言的。数据类型为两类:简单类型 和 复杂类型。数据类型可以是有名的全局的数据类型,也可以是局部的无名的数据类型。 简单类型: 不包含任何子元素和属性的元素。也就是只包含文本内容或为空元素。 XML Schema中常用的基础类型有: string string 数据类型的取值可以是任意字符串 float IEEE 的单精度 32 位浮点数。
date 用于指定一个日期,具体格式为:YYYY-MM-DD,其中:YYYY 表示年;MM 表示月;DD 表示日。假如 <xsd:element name="start" type="xsd:date"/>,那么该元素可以为 <start>2002-09-24</start>。 boolean 用于指定 true 或者 false。合法的取值包括:true、false、1(表示 true)、0(表示 false)。
自定义的简单类型可以通过限制、列表或者组合来构造新的类型。 限制 restriction: <xsd:simpleType> <xsd:restriction base="BaseType"> ... facets descriptions ... </xsd:restriction> </xsd:simpleType>base表示由什么数据类型进行的派生。 限制的方面有一下几种限制: enumeration 定义一组合法的取值。 列表List: 使用列表,列出列表中要求的数据类型。 可以是<xsd:list>....</xsd:list>中添加要求列表的数据类型,也可以是<xsd:list itemtype = " ... "/>直接调用全局的数据类型进行列表。
合并Union: 列表中只能对同一种数据类型进行存放。若有多种数据类型,则使用union。具体操作与List中类似
复杂类型: 包含子元素或属性的元素,而属性的声明包含在复杂类型的定义中。
包含属性的元素: <xsd:complexType name="ComplexType"> <xsd:attribute name="Att1Name" type="someSimpleType1"/> ...... </xsd:complexType>在其中对属性的类型进行约束。 包含元素的元素: XML Schema中有三种容器,以不同的出现顺序来包含子元素。子元素必须包含在容器中。 xsd:sequence: 表示序列,即元素必须按照声明顺序依次出现。 xsd:choice 表示选择,即从中选取一个元素出现。 xsd:all 表示所包含的内容全部需要出现,但是不分先后顺序。
包含属性和文本内容的元素: 使用simpleContent来表示文本内容或文本内容加属性。 <xsd:element name="ele_name"> <xsd:complexType> <xsd:simpleContent> .... </xsd:simpleContent> </xsd:complexType> </xsd:element>其中也可使用xsd:extension或xsd:restriction来限制文本内容的类型时,只能base=""基础属性,xsd:extension中只能继续对属性进行限制。
包含文本属性和子元素 必须使用mixed属性来表明其包含的是混合内容 <xsd:complexType mixed="true"> ..... </xsd:complexType> simpleType中有: final 属性的值表示该数据类型不允许进行的操作的列表,#all 表示不能对该类型进行任何操作。或者是list | union | restriction 面向对象的特性: abstract 属性表示该复杂类型是一个虚类型,只能用作其他类型的父类型。 final (#all | List of (extension | restriction)) 不能以all或者extenson或者 restriction的方式派生子类型 block 限制使用多态性,取值可能为 #all、extension、restriction。extension 和 restriction,分别表示禁止使用任何通过扩展/限制而派生的子类型的实例来代替声明为父类的元素。 其中final表示不能派生子类型,而block是不能使用子类型来对声明为父类的元素 实例化。 多态性的演示: XML Schema: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="book"> <xs:annotation> <xs:documentation>Comment describing your root element</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="title" type="titleType"/> <xs:element name="author" maxOccurs="3"/> <xs:element name="section" type="sectionType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="sectionType"> <xs:sequence> <xs:element name="title" type="titleType"/> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="p"/> <xs:element name="figure"> <xs:complexType> <xs:sequence> <xs:element name="title" type="titleType"/> <xs:element name="image"> <xs:complexType> <xs:attribute name="source" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="width" use="required"/> <xs:attribute name="height" use="required"/> </xs:complexType> </xs:element> <xs:element name="section" type="sectionType"/> </xs:choice> </xs:sequence> <xs:attribute name="id"/> <xs:attribute name="difficulty"/> </xs:complexType> <xs:simpleType name="titleType"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="100"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="bookTitleType"> <xs:restriction base="titleType"> <xs:pattern value="(Data On the Web|TCP/IP Illustrated)"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="sectionTitleType"> <xs:restriction base="titleType"> <xs:pattern value="([1-9][0-9]*(-[1-9][0-9]*)?..*)"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="figureTitleType"> <xs:restriction base="titleType"> <xs:pattern value="([1-9][0-9]*-[1-9][0-9]*(-[1-9][0-9]*)?..*)"/> </xs:restriction> </xs:simpleType> </xs:schema> 对其中的titleType使用运行时多态。 <?xml version="1.0" encoding="UTF-8"?> <!--用XMLSpy v2012产生的 XML文件(http://www.altova.com)--> <book xsi:noNamespaceSchemaLocation="book.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <title xsi:type="bookTitleType">Data On the Web</title> <author>text</author> <author>text</author> <author>text</author> <section id="text" difficulty="text"> <title xsi:type="sectionTitleType">1.xxxx</title> <p>text</p> </section> <section id="text" difficulty="text"> <title xsi:type="sectionTitleType">1-1.xxxx</title> <p>text</p> </section> <section id="text" difficulty="text"> <title>a</title> <figure width="12" height="24"> <title xsi:type="figureTitleType">1-1-1.xxxx</title> <image source=""></image> </figure> </section> <section id="text" difficulty="text"> <title xsi:type="sectionTitleType">120.250.215uafghaoh</title> <section> <title>afas</title> <figure width="" height=""> <title xsi:type="figureTitleType">1-1-1.xxxx</title> <image source=""></image> </figure> </section> </section> </book> XML Schema中element其他的一些常用属性: default = string 缺省值
对于xsd:element元素有unique、key、keyref来约束其为唯一值,键 和 键引用。 key的一个实例: <xs:key name="spyIDkey"> <xs:selector xpath="spyTable/row"/> <xs:field xpath="@spyID"/> </xs:key>其中xs:selector 通过xpath选择一个元素集,是xs:field选择的属性或者元素或者其他值在 这个元素集为唯一值。unique的操作类似。 keyref多了一个refer,表示引用的key的名称: <xs:keyref name="mrefkey" refer="spyIDkey"> <xs:selector xpath="missionTable/row"/> <xs:field xpath="spyREF"/> </xs:keyref> 下面为完整的XML Schema: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="info"> <xs:annotation> <xs:documentation>Comment describing your root element</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="aliasTable"> <xs:complexType> <xs:sequence> <xs:element name="row" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="spyREF" type="xs:IDREF"/> <xs:element name="alias" type="xs:string"/> </xs:sequence> <xs:attribute name="aID" type="xs:int" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="missionTable"> <xs:complexType> <xs:sequence> <xs:element name="row" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="spyREF" type="xs:IDREF"/> <xs:element name="date" type="mydate"/> <xs:element name="description" type="xs:string"/> <xs:element name="status" type="statusType"/> </xs:sequence> <xs:attribute name="mID" type="xs:ID" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="spyTable"> <xs:complexType> <xs:sequence> <xs:element name="row" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="firstName"/> <xs:element name="lastName"/> </xs:sequence> <xs:attribute name="spyID" type="xs:ID" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="spyIDkey"> <xs:selector xpath="spyTable/row"/> <xs:field xpath="@spyID"/> </xs:key> <xs:keyref name="mrefkey" refer="spyIDkey"> <xs:selector xpath="missionTable/row"/> <xs:field xpath="spyREF"/> </xs:keyref> <xs:key name="mIDkey"> <xs:selector xpath="missionTable/row"/> <xs:field xpath="@mID"/> </xs:key> <xs:key name="aIDkey"> <xs:selector xpath="aliasTable/row"/> <xs:field xpath="@aID"/> </xs:key> <xs:keyref name="aREF" refer="spyIDkey"> <xs:selector xpath="aliasTable/row"/> <xs:field xpath="spyREF"/> </xs:keyref> </xs:element> <xs:simpleType name="statusType"> <xs:restriction base="xs:string"> <xs:enumeration value="Mission Accomplished"/> <xs:enumeration value="In Progress"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="mydate"> <xs:restriction base="xs:string"> <xs:pattern value="([1-9][0-9]{3}-([1-9]|1[0-2])-([1-9]|[1-2][0-9]|3(0|1)))"/> </xs:restriction> </xs:simpleType> </xs:schema>
另一个直接用xmlspy转换得到的XML Schema: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace"/> <xs:element name="info"> <xs:complexType> <xs:sequence> <xs:element ref="row" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="row"> <xs:complexType> <xs:sequence> <xs:element ref="firstName"/> <xs:element ref="lastName"/> <xs:element ref="alias" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="mission" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="spyID" type="xs:ID" use="required"/> </xs:complexType> </xs:element> <xs:element name="firstName"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="lastName"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="alias"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="mission"> <xs:complexType> <xs:sequence> <xs:element ref="date"/> <xs:element ref="description"/> <xs:element ref="status"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="date"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="description"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="status"> <xs:complexType mixed="true"/> </xs:element> </xs:schema> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |