xml中的约束有DTD约束和schema约束
DTD约束比较简单好用,但是局限性非常大,而schema约束比较全面而强大,但是使用起来略微麻烦
我们可以用一个DTD约束来约束我们的xml里面有那些属性和标签举个栗子:
<!ELEMENT 书架 (书+)><!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
一个这样的约束,我们可以写出这样的xml文档:
<?xml version="1.0" encoding="utf-8"?>
<!--这里引入约束-->
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
我们通过一个这样的约束确实可以防止后面的朋友在里面乱写其他东西
但是 如果 我的书售价有限定 只能是正数0--199之间(谁都不可能卖书倒贴钱的),这个dtd就做不到了
下面看下我们的schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn"
elementFormDefault="qualified">
<xs:element name='书架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' >
<xs:element name='书' >
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type="xs:positiveInteger"minOccurs="1"maxOccurs="200"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
去写xml的时候就能实现我们之前dtd约束锁不能实现的事情了:
<?xml version="1.0" encoding="UTF-8"?>
<!--引入约束-->
<xchl:书架 xmlns:xchl="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn books.xsd ">
<xchl:书>
<xchl:书名>dd</xchl:书名>
<xchl:作者>ee</xchl:作者>
<xchl:售价>88</xchl:售价>
</xchl:书>
<xchl:书>
<xchl:书名>dd</xchl:书名>
<xchl:作者>ee</xchl:作者>
<xchl:售价>99</xchl:售价>
</xchl:书>
<xchl:书>
<xchl:书名>dd</xchl:书名>
<xchl:作者>ee</xchl:作者>
<xchl:售价>23</xchl:售价>
</xchl:书>
</xchl:书架>
当然里面的元素我大概填的
我们可以看到这里不管是约束本身还是约束的引入都显得比dtd繁琐很多,我下面贴一下引入一个约束的步骤:
如何引入schema到xml中。
a、建立一个新的xml文件,加入声明.
<?xml version="1.0" encoding="UTF-8"?>
b、查看要引入的schema约束文档,找到定义的第一个元素,该元素就是xml中的根元素。
<?xml version="1.0" encoding="UTF-8"?>
<书架>
</书架>
c、思考:“书架”来自哪个名称空间?用xmlns声明该元素来自的名称空间。
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:itcast="">
</书架>
d、查看schema,把targetNamespace的值写到xml中的名称空间定义中
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.cn">
</itcast:书架>
e、xml中使用的名称空间对应的是哪个xsd文件呢?用schemaLocation来指定名称空间和xsd文件的对应关系
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.cn"
schemaLocation="http://www.itcast.cn books.xsd">
</itcast:书架>
f、思考:schemaLocation又来自哪个名称空间呢?来自一个标准的名称空间(W3C)http://www.w3.org/2001/XMLSchema-instance
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn books.xsd">
</itcast:书架>
完成上面的步骤你就成功的引入了schema约束啦,呵呵,祝君好运。