XML_04_XML Schema

DTD的不足

语法结构问题:与XML语法不一致,不支持DOM、XPath、XSLT等
数据类型问题:有限的数据类型,不支持布尔、日期、时间等数据,不能扩展
文档结构问题:DTD中元素和属性是全局的,不是上下文相关的
名称空间问题:不支持名称空间

Schema的特点

Schema的优势
Schema是独立的XML文档,扩展名为.xsd
已经定义了丰富的数据类型,支持派生,支持格式约束
元素、属性具有上下文相关性
支持名称空间
Schema的不足
不能嵌入到XML文档中
语法较复杂
还不能定义属性和属性值的相关性,如若CPU的“厂商”为“Other”则必须在“描述”中声明
XML文档-》note.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="note.xsd">
  4. <to>Tove</to>
  5. <from>Jani</from>
  6. <heading>Reminder</heading>
  7. <body>Don‘t forget me Forever!</body>
  8. </note>

DTD文档-》note.dtd

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <!ELEMENT note (to, from, heading, body)>
  3. <!ELEMENT to (#PCDATA)>
  4. <!ELEMENT from (#PCDATA)>
  5. <!ELEMENT heading (#PCDATA)>
  6. <!ELEMENT body (#PCDATA)>

schema文档-》note.xsd

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  3. <xs:element name="note">
  4. <xs:complexType>
  5. <xs:sequence>
  6. <xs:element name="to" type="xs:string"/>
  7. <xs:element name="from" type="xs:string"/>
  8. <xs:element name="heading" type="xs:string"/>
  9. <xs:element name="body" type="xs:string"/>
  10. </xs:sequence>
  11. </xs:complexType>
  12. </xs:element>
  13. </xs:schema>

根元素schema

Schema文档的根元素schema的声明<?xml version="1.0"
encoding="GB2312"?><xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">Schema文档的根元素只能为schemaschema
中用到的元素和数据类型来自名称空间"http://www.w3.org/2001/XMLSchema”elementFormDefault和
attributeFormDefault分别为qualified(限定的)和unqualified(非限定的),表明元素名称需要给出名称空间,而
属性名不需要

名称空间的声明

Schema中对名称空间的声明:<xs:schema  targetNamespace=“目标名称空间URL"    
xmlns:xs="http://www.w3.org/2001/XMLSchema"    
xmlns=“默认名称空间URL">targetNamespace(目标名称空间):是引用该Schema的XML文档的名称空间,即XML文
档中元素、属性、数据类型等名称的有限范围,对应的是一个URL,可以不是一个文件标准名称空间:即定义了Schema标准的名称空间,包括
schema、element、simpleType、string等关键字、内置数据类型和标准的Schema语法等默认名称空间:即省略了名称空间前
缀的名称所属的空间(可以与目标空间不同)

名称空间的引用

在XML文档中引用Schema的名称空间:其实这个特点的好处就是可以为特定的命名空间绑定特定的schema,一般情形使用前者即可,简单
若Schema文档中没有定义目标名称空间,则<元素名称
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“Schema文档URI">若Schema文档中已定义了目标名称空间,则&
lt;元素名称  xmlns=“默认空间URL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="目标空间URL 
Schema文档URI">
例如

[html] view plain copy

  1. <!--Schema文档(文件名为score.xsd)-->
  2. <?xml version="1.0" encoding="gb2312"?>
  3. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns=“http://127.0.0.1/xml” targetNamespace=“http://127.0.0.1/xml” elementFormDefault="qualified" attributeFormDefault="unqualified">
  4. <xs:element name="学生" type=“xs:string"/>
  5. </xs:schema>
  6. <!--XML文档-->
  7. <?xml version="1.0" encoding="GB2312"?>
  8. <学生 xmlns=http://127.0.0.1/xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation="http://127.0.0.1/xml score.xsd">张绍康</学生>

元素和属性的声明
在根元素schema下定义顶层子元素(top level element),在某元素内定义其子元素和属性
元素声明
<xs:element name=名称  type=类型/>
属性声明
<xs:attribute name=名称  type=类型 use=次数/>

数据类型

Schema的数据类型分为简单类型、复杂类型两种
复杂类型complexType
复杂类型定义XML元素的结构关系,如包含属性、子元素、子元素间的关系等例如

[html] view plain copy

  1. <xs:complexType name="学生型">
  2. <xs:sequence>
  3. <xs:element name="姓名" type="xs:string"/>
  4. <xs:element name="年龄" type="xs:int" minOccurs="0"/>
  5. </xs:sequence>
  6. <xs:attribute name="学号" type="xs:int"/>
  7. </xs:complexType>

Schema中可定义“学生型”元素:
 <xs:element name=“学生” type=“学生型”/>
只有元素的内容可以是复杂类型的
简单类型simpleType
简单类型的数据是XML最小的结构单位例如

[html] view plain copy

  1. <xs:simpleType name=“编号型”>
  2. <xs:restriction base=“xs:int”/>
  3. </xs:simpleType>

定义了“编号型”数据类型,其基础类型为整型,因此
<xs:attribute name=“编号” type=“编号型”/> 
<xs:element name=“编号” type=“编号型”/>
所定义的属性、元素的内容都必须是整型
若元素是简单类型,则不能包含子元素。对于属性而言,由于属性值不允许再分割,因此只能是简单类型
数据类型派生(Derivation)
与面向对象方法中类的派生相似,XML
Schema支持数据类型的派生,即在已经定义的数据类型基础上,定义新的数据类型。可以在简单类型基础上派生新的简单类型或复杂类型,也可以在复杂类型
基础上派生新的复杂类型。复杂类型的派生有扩展派生(extension)、约束派生(restriction)两种,简单类型的派生有扩展派生、约束派
生、列表派生(list)、联合体派生(union)四种。最常见的派生是复杂类型的扩展派生、约束派生和简单类型的约束派生例如

[html] view plain copy

  1. <xs:simpleType name=“邮政编码”>
  2. <xs:restriction base=“xs:string”>
  3. <xs:pattern value=“\d{6}”/>
  4. </xs:restriction>
  5. </xs:simpleType>

Schema的内部数据类型

Schema内置了许多数据类型,包括字符串、数值、逻辑、日期时间、URI等,其中大部分是简单类型。默认类型可以是anyType或anySimpleType。
只有部分内置的数据类型属于原始类型(Primitive),即不能通过取值约束方式从其他数据类型派生出来的数据类型,这些数据类型包括:
字符型:string、QName、NOTATION
数值型:float、double、decimal逻辑型:boolean
日期时间型:date、time、duration、eYear、……
URI型:anyURI二进制:base64Binary、hexBinary

复杂类型complexType
complexType定义复杂数据类型,声明元素的属性、子元素、文本内容等
复杂数据类型可以是具名的,也可以是匿名的
具名复杂类型(必须有name属性)只能定义在schema元素下,是全局的
匿名复杂类型(不能有name属性)只能出现在element元素下,是局部的若complexType的父元素是schema或redifine,就必须有一个simpleContent或complexContent子元素。
若父元素是element,则可以包含attribute、group等子元素。
complexContent
complexContent是complexType的子元素,表示该complexType将显式地从其他complexType派生。
complexContent必须有一个子元素extension或restriction来扩展或约束complexType的定义
simpleContensimpleContent用于从simpleType派生complexType,表示该complexType只有文本内容,没有子元素

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"   elementFormDefault="qualified" attributeFormDefault="unqualified">
  3. <xs:element name="文件系统">
  4. <xs:complexType>
  5. <xs:complexContent>
  6. <xs:restriction base="目录类">
  7. <xs:sequence>
  8. <xs:element name="目录" type="目录类" minOccurs="0" maxOccurs="unbounded" />
  9. <xs:element name="文件" type="文件类" minOccurs="0" maxOccurs="unbounded" />
  10. </xs:sequence>
  11. <xs:attribute name="创建时间" type="xs:dateTime" use="prohibited"/>
  12. <!--不能出现在实例文档中 -->
  13. </xs:restriction>
  14. </xs:complexContent>
  15. </xs:complexType>
  16. </xs:element>
  17. <xs:complexType name="目录类" final="extension">
  18. <xs:complexContent>
  19. <xs:extension base="文件类">
  20. <xs:sequence>
  21. <xs:element name="目录" type="目录类" minOccurs="0"
  22. maxOccurs="unbounded" />
  23. <xs:element name="文件" type="文件类" minOccurs="0"
  24. maxOccurs="unbounded" />
  25. </xs:sequence>
  26. </xs:extension>
  27. </xs:complexContent>
  28. </xs:complexType>
  29. <xs:complexType name="文件类">
  30. <xs:attribute name="名称" type="文件名" use="required" />
  31. <xs:attribute name="创建时间" type="xs:dateTime" />
  32. </xs:complexType>
  33. <xs:simpleType name="文件名" final="#all">
  34. <xs:restriction base="xs:token">
  35. <xs:pattern value=‘[^|\\\*\?:"<>]+‘ />
  36. </xs:restriction>
  37. </xs:simpleType>
  38. </xs:schema>

简单类型simpleType
simpleType定义从Schema已定义的简单类型再派生的简单类型,简单类型不能再包含任何元素或属性简单数据类型也可以分为
具名的或匿名的具名简单类型有name属性,只能定义在schema元素下,是全局的匿名简单类型不能有name属性,可以出现在element、
attribute、list、restriction、union元素下,是局部的complexType必须有一个子元素,可以是list、
union或restriction之一
array.xsd:

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"   elementFormDefault="qualified" attributeFormDefault="unqualified">
  3. <xs:element name="数组">
  4. <xs:complexType>
  5. <xs:attribute name="数组元素" type="整数列表" use="required"/>
  6. <xs:attribute name="容量" type="整数和无穷" use="required"/>
  7. </xs:complexType>
  8. </xs:element>
  9. <xs:simpleType name="整数列表">
  10. <xs:list itemType="整数和无穷"/>
  11. </xs:simpleType>
  12. <xs:simpleType name="整数和无穷">
  13. <xs:union memberTypes="xs:integer">
  14. <xs:simpleType>
  15. <xs:restriction base="xs:NMTOKEN">
  16. <xs:enumeration value="无穷"/>
  17. </xs:restriction>
  18. </xs:simpleType>
  19. </xs:union>
  20. </xs:simpleType>
  21. </xs:schema>

array.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <数组 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="array.xsd" 容量="3" 数组元素="1 -1 无穷">
  4. </数组>

扩展entension

[html] view plain copy

  1. <xs:simpleType name="姓名">
  2. <xs:restriction base="xs:token">
  3. <xs:minLength value="2"/>
  4. </xs:restriction>
  5. </xs:simpleType>
  6. <xs:complexType name="人员">
  7. <xs:simpleContent>
  8. <xs:extension base="姓名">
  9. <xs:attribute name="性别" use="required"/>
  10. </xs:extension>
  11. </xs:simpleContent>
  12. </xs:complexType>

列表
list.xsdxml version="1.0" encoding="GB2312"?>

  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • <xs:element name="专家门诊">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="专科" maxOccurs="unbounded">
  • <xs:complexType>
  • <xs:attribute name="名称" type="xs:token" use="required"/>
  • <xs:attribute name="专家" type="姓名列表" use="required"/>
  • </xs:complexType>
  • </xs:element>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • <xs:simpleType name="姓名列表">
  • <xs:list>
  • <xs:simpleType>
  • <xs:restriction base="xs:token">
  • <xs:minLength value="2"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:list>
  • </xs:simpleType>
  • </xs:schema>

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <专家门诊 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="list.xsd">
  4. <专科 专家="张三 李四 王五" 名称="内科" />
  5. </专家门诊>

并union

[html] view plain copy

  1. <xs:simpleType name="成绩">
  2. <xs:union>
  3. <xs:simpleType>
  4. <xs:restriction base="xs:NMTOKEN">
  5. <xs:enumeration value="优秀"/>
  6. <xs:enumeration value="良好"/>
  7. <xs:enumeration value="中"/>
  8. <xs:enumeration value="及格"/>
  9. <xs:enumeration value="不及格"/>
  10. </xs:restriction>
  11. </xs:simpleType>
  12. <xs:simpleType>
  13. <xs:restriction base="xs:int">
  14. <xs:minInclusive value="0"/>
  15. <xs:maxInclusive value="100"/>
  16. </xs:restriction>
  17. </xs:simpleType>
  18. </xs:union>
  19. </xs:simpleType>
  20. <xs:attribute name=“成绩” type=“成绩”/>
  21. <学生 name=“张三” 成绩=“95”/>
  22. <学生 name=“李四” 成绩=“及格”/>

选择choice······

数据取值

Schema的优势之一是允许对数据的取值进行综合设置,可以定义数据的取值范围、输入和显示方式,等等。
取值约束
对简单类型,可以采用取值约束限制数据的取值:
长度限制:length、maxLength、minLength
大小限制:maxExclusive、minExclusive、maxInclusive、minInclusive
精度限制:fractionDigits、totalDigits
模式匹配:pattern(正则表达式)
空白处理:whiteSpace
枚举类型:enumeration

[html] view plain copy

  1. <xs:simpleType name=“邮政编码”>
  2. <xs:restriction base=“xs:string”>
  3. <xs:pattern value=“[0-9]+” fixed=“1”/>
  4. <xs:length value=“6” fixed=“true”/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. <xs:simpleType name=“技术职称”>
  8. <xs:restriction base=“xs:string”>
  9. <xs:enumeration value=“教授”/>
  10. <xs:enumeration value=“副教授”/>
  11. <xs:enumeration value=“讲师”/>
  12. <xs:enumeration value=“助教”/>
  13. <xs:enumeration value=“无”/>
  14. </xs:restriction>
  15. </xs:simpleType>

键key和键引用
keyrefKey元素定义键约束,键的值由一个或多个字段组成,在实例文档中,对于包含键的的元素,键值必须是唯一的已定义的键可以被keyref元素
通过refer属性引用,以构成键引用约束在key元素中,从包含元素开始,用selector元素选出key的参考元素,在参考元素基础上,用
field元素选出键值
keyref.xsd

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3. <xs:element name="学生名单">
  4. <xs:complexType>
  5. <xs:sequence>
  6. <xs:element name="班级" maxOccurs="unbounded">
  7. <xs:complexType>
  8. <xs:sequence>
  9. <xs:element name="学生" maxOccurs="unbounded">
  10. <xs:complexType>
  11. <xs:sequence>
  12. <xs:element name="姓名" type="xs:token"/>
  13. <xs:element name="学号" type="xs:token"/>
  14. </xs:sequence>
  15. </xs:complexType>
  16. </xs:element>
  17. <xs:element name="班长">
  18. <xs:complexType>
  19. <xs:attribute name="学号" type="xs:token" use="required"/>
  20. </xs:complexType>
  21. </xs:element>
  22. </xs:sequence>
  23. </xs:complexType>
  24. <xs:key name="学生学号">
  25. <xs:selector xpath="学生"/>
  26. <xs:field xpath="学号"/>
  27. </xs:key>
  28. <xs:keyref name="班长学号" refer="学生学号">
  29. <xs:selector xpath="班长"/>
  30. <xs:field xpath="@学号"/>
  31. </xs:keyref>
  32. </xs:element>
  33. </xs:sequence>
  34. </xs:complexType>
  35. </xs:element>
  36. </xs:schema>

keyref.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <学生名单 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="keyref.xsd">
  3. <班级>
  4. <学生>
  5. <姓名>张三</姓名>
  6. <学号>0001</学号>
  7. </学生>
  8. <学生>
  9. <姓名>李四</姓名>
  10. <学号>0002</学号>
  11. </学生>
  12. <班长 学号="0002"/>
  13. </班级>
  14. </学生名单>

外部文档

导入import所导入的Schema的目标名称空间(由根元素schema的
targetNameSpace属性声明)不能与当前Schema的目标名称空间相同如果所导入的Schema没有目标名称空间,则其中的定义和说明都不
会被导入包含include若要包含的Schema具有目标名称空间,则必须与当前Schema相同若没有声明目标名称空间,则所包含的声明和定义都与当
前Schema合并为一个整体

[html] view plain copy

    时间: 2024-10-10 22:55:43

    XML_04_XML Schema的相关文章

    logback-spring.xml的schema

    <?xml version="1.0" encoding="utf-8" ?> <configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"> </configuration>

    schema中的虚拟属性方法

    schema中的虚拟属性方法相当于vue中的计算属性,它是通过已定义的schema属性的计算\组合\拼接得到的新的值 var personSchema = new Schema({ name: { first: String, last: String } }); var Person = mongoose.model('Person', personSchema); // create a document var bad = new Person({ name: { first: 'Walt

    改善database schema

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/50422102 本文作者:苏生米沿 Hibernate 读取你java模型类的映射元数据,并且生成schemaDDL语句.你可以将它们导出到一个text文件中,或者当你在继承测试运行的时候直接在数据库执行.因为大多数数据库schema语言是有产品特性的,你需要一直保持在头脑中的是每一个你加入到映射元数据的选项都有潜力绑定到一个特定的数据库. Hibernate 给你的表和约束自动创建基

    XML的DTD和Schema约束

    为什么要使用约束? XML是自定义的标签,有时候标签太多,记不住,所以就需要有约束来告诉我能写哪些标签,哪些标签写错了不能识别 XML中有哪几种约束? 有很多约束,其中DTD和Schema约束最为常见. 约束本质上是什么? 约束本质上也是一种xml文件. DTD约束和Schema约束的区别 特点的区别: DTD约束较为古老,简单,一些老框架使用DTD作为约束:Struts2和Hibernate都使用DTD作为其XML配置文件的约束 Schema约束功能更为强大,用的更为广泛,Tomcat和Spr

    使用Schema配置切面

    除了只用接口和注解定义增强处理,还可以在Spring配置文件中通过aop命名空间将一个普通的JavaBean中的方法声明为增强处理 1.UserBizLogger 1 //使用Schema 不用注解,不用实现接口 2 public class UserBizLogger { 3 private static final Logger log = Logger.getLogger(UserBizLogger.class); 4 //前置增强 5 public void before(JoinPoi

    WebService . Schema约束

    1. namespace 相当于schema文件的id 2. targetNamespace属性 用来指定schema文件的namespace的值 3. xmlns属性 引入一个约束, 它的值是一个schema文件的namespace值 4. schemaLocation属性 用来指定引入的schema文件的位置   schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的schema文件都需要有一个id, 但在这里它叫namespace, 3. namespace

    cassandra的schema version, gossip_generation 和host id

    这是cassandra里面很重要的三个值; schema version是cassandra cluster里每个node的schema版本,什么叫版本呢?因为cassandra是无中心化的,所以你很难知道所有的node上的schema是否是一致的.你不可能每次把所有的schema都拿了去比较一次.这样很不高效.所以cassandra里就有了schema version这个概念.每次执行DDL操作的时候,都会新生成一个新的schema version, 当这个DDL操作复制到其他node的时候,

    springsecurity启动出现org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: You must use a 3.0 schema with Spring Security 3.0.

    在换了spring-security的jar包以后启动出现org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: You must use a 3.0 schema with Spring Security 3.0.Please update your schema declarations to the 3.0.3 schema (spring-securi

    Failed to read schema document &#39;http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#39;问题解决方法

    或者报错: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'context:annotation-c