我们已经知道了只有有约束的XML文件才能算是一个有效的文件,说到约束除了dtd约束还可以有其他的方法吗?
接下来就是我要介绍的新的约束——schema约束:
XMLSchema 也是一种用于定义和描述 XML文档结构与内容的模式语言,其出现是为了克服 DTD的局限性
XMLSchema VS DTD:
XMLSchema符合XML语法结构。
DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
XMLSchema对名称空间支持得非常好。
XMLSchema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
XMLSchema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
那么什么是schema呢?
接下来让我们来看看schema语法的具体说明:
名称空间的概念:
<csdn:书架xmlns:csdn=“http://www.csdn.net”>
<csdn:书>……</csdn:书>
</csdn:书架>
此处使用csdn来指向声明的名称,以便于后面对名称空间的引用。
<csdn:书架xmlns:csdn="http://www.csdn.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.csdn.netbook.xsd">
schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XML schema 的位置,两者之间用空格分隔。
那么究竟schema的语法又是什么呢?
xsd约束文件:
<?xml version="1.0" encoding="UTF-8"?>
<game:schema xmlns:game="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/asd"
xmlns="http://www.example.org/asd"
elementFormDefault="qualified">
<!-- 需要引用w3c的命名空间,并指定一个命名空间,将所有的约束绑定到指定的命名空间当中 -->
<!--
schema语法练习:
1.XSD简易属性
2.XSD属性
3.限定值
4.通过枚举限定值
5.根据正则表达式来限定值
6.定义以及使用复合类型
7.XSD仅含文本复合元素
-->
<!-- 6.定义复合类型 -->
<game:complexType name="game_Name"><!-- 6.使用复合类型 -->
<game:all>
<game:element name="刀塔" type="game:string"/>
<game:element name="英雄联盟" type="game:string"/>
<game:element name="反恐精英" type="game:string"/>
</game:all>
</game:complexType>
<game:element name="电子竞技">
<game:complexType>
<game:sequence>
<game:element name="names" type="game_Name" /><!-- 6.引用复合类型 -->
<game:element name="DOTA2" type="game:string" default="MOBA"/><!-- 1.设置默认值 -->
<game:element name="DNF" type="game:string" fixed="ACT"/><!-- 1.设置固定值 -->
<game:element name="CS">
<game:complexType>
<game:attribute name="name" type="game:string" use="required"/><!-- 2.设置属性(属性需要设置在复合类型之中) -->
</game:complexType>
</game:element>
<game:element name="return"><!-- 3.限定值 -->
<game:simpleType>
<game:restriction base="game:integer">
<game:minExclusive value="10"/>
<game:maxExclusive value="100"/>
</game:restriction>
</game:simpleType>
</game:element>
<game:element name="sex"><!-- 4.通过枚举限定值 -->
<game:simpleType>
<game:restriction base="game:string">
<game:enumeration value="M"/>
<game:enumeration value="F"/>
</game:restriction>
</game:simpleType>
</game:element>
<game:element name="word"><!-- 5.根据正则表达式限定值 -->
<game:simpleType>
<game:restriction base="game:string">
<game:pattern value="[a-z]"/>
</game:restriction>
</game:simpleType>
</game:element>
<game:element name="habit"><!-- 7.XSD仅含文本复合元素 -->
<game:complexType>
<game:simpleContent>
<game:extension base="game:string">
<game:attribute name="country" type="game:string"/>
</game:extension>
</game:simpleContent>
</game:complexType>
</game:element>
</game:sequence>
</game:complexType>
</game:element>
</game:schema>
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<xx:电子竞技 xmlns:xx="http://www.example.org/asd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/asd asd.xsd">
<xx:names>
<xx:刀塔></xx:刀塔>
<xx:英雄联盟></xx:英雄联盟>
<xx:反恐精英></xx:反恐精英>
</xx:names>
<xx:DOTA2>MOBA</xx:DOTA2><!-- 设置默认值为MOBA -->
<xx:DNF>ACT</xx:DNF><!-- 设置固定值为ACT(缺省也为ACT) -->
<xx:CS name="electric"></xx:CS>
<xx:return>11</xx:return>
<xx:sex>M</xx:sex>
<xx:word>a</xx:word>
<xx:habit>DOTA2</xx:habit>
</xx:电子竞技>
其他(补充,any和anyattribute):
xsd文件:
cl.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3cschool.cn"
xmlns="http://www.w3cschool.cn"
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:attribute name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="Retror|Cold"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:schema>
persons.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://person.cn/p"
xmlns="http://person.cn/p"
elementFormDefault="qualified">
<xs:element name="persons">
</xs:element>
</xs:schema>
xn.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/xn"
xmlns="http://www.example.org/xn"
elementFormDefault="qualified">
<xs:element name="sex" type="xs:string"/>
<xs:element name="gender" substitutionGroup="sex"/><!-- 元素替换的操作 -->
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element ref="sex"/><!-- 引用 需要在扩展之前-->
<xs:any minOccurs="0"/><!-- 扩展元素 -->
</xs:sequence>
<xs:anyAttribute/><!-- 扩展属性 -->
</xs:complexType>
</xs:element>
</xs:schema>
xn.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://person.cn/p"
xmlns:p="http://www.example.org/xn"
xmlns:c="http://www.w3cschool.cn"
xsi:schemaLocation="http://www.example.org/xn xn.xsd http://www.w3cschool.cn cl.xsd http://person.cn/p persons.xsd">
<p:person c:name="Retror">
<p:firstname></p:firstname>
<p:lastname></p:lastname>
<p:gender></p:gender>
<c:children>
<c:childname>xxx</c:childname>
</c:children>
</p:person>
</persons>
希望能帮到大家!