Schema 验证和 DTD 验证

到目前为止,XML 仍然是一种很新的技术,因此已经出版的大部份讲 XML 的书里都缺乏对开发实践的介绍。很多朋友看了这些书以后,因为缺乏实践,学了半天还是搞不清楚 XML 究竟可以做什么,能否把 XML 用于我们的日常开发。我决定做一个简单的例子给大家演示一下 XML 开发的过程。这篇帖子就算是我应朋友的要求做的 XML 开发教程一系列帖子中的第一篇。

这个例子来自于电子工业出版社的《XML 轻松进阶》,原来的例子只做了 DTD 定义和 XML 文件,我对例子做了修改并添加了很多内容以适应我们的要求。
大家可以共同来维护这个例子,为它添加新的功能以便演示 XML 开发的各个方面,最终我希望能把它做成一个完善而又易懂的演示 XML 开发的例子。

首先讲讲我对这个软件的需求:
我 有很多的书,我想把关于这些书的信息输入电脑。为了便于处理,我希望这些信息能够保存为 XML 格式。我还想定义一个自己的 DTD 或者 Schema,以便我在 XML 文件中保存信息时,文件的的格式能够有章可循。因为我装有支持 XML 的浏览器 Mozilla,只要提供一个 XSL 样式单,我就可以直接使用 Mozilla 查看我所保存的信息。为了演示 XML 和现实世界的联系,我决定把这些信息存入数据库,通过 JSP 获取数据库中的信息,并且在服务器端完成 XSLT 转换,这样我就可以使用任何浏览器查看我所保存的信息了。最后,因为我是中国人,我希望能够在这个软件中自由地使用中文。

这就是我对这个软件的全部需求,所有的需求都是明确而具体的。

为了实现这些需求,我们分几步来完成。
1。建立 DTD 和 XML 文件,并且进行 DTD 验证。
2。建立 Schema 和 XML 文件,并且进行 Schema 验证。
3。建立 XSL 样式表,在 Mozilla 中浏览 XML 文件。
4。将信息存入数据库,使用 JSP 获取信息,并且在服务器端完成 XSLT 转换。
5。解决软件中的中文处理问题。

今天我先讲一下第一步。

首先我要定义一个 DTD。
< ?xml version="1.0" encoding="utf-8" ?>
< !ELEMENT library (book*)>
< !ELEMENT book (title, author, publisher, cover, category, isbn, rating, comments?)>
< !ELEMENT title (#PCDATA)>
< !ELEMENT author (#PCDATA)>
< !ELEMENT publisher (#PCDATA)>
< !ELEMENT cover EMPTY>
< !ATTLIST cover type (hardback | paperback) "paperback">
< !ELEMENT category EMPTY>
< !ATTLIST category class (entertainment | technology) "entertainment">
< !ELEMENT isbn (#PCDATA)>
< !ELEMENT rating EMPTY>
< !ATTLIST rating number (1 | 2 | 3 | 4 | 5) "3">
< !ELEMENT comments (#PCDATA)>

将文件保存为 library.dtd。
这 个 DTD 是一目了然的。library 元素可以包含任意多个 book 元素。book 元素可以包含一个 title 元素,一个 author 元素,一个 publisher 元素,一个 cover 元素,一个 category 元素,一个 isbn 元素,一个 rating 元素和一个可选的 comments 元素。cover 元素可以有一个 type 属性。category 元素可以有一个 class 属性。rating 元素可以有一个 number属性。其中各元素的含义为:
library:图书馆。book:书。title:标题。author:作者。publisher:出版商。cover:封面类型(精装/简装)。category:类别。isbn:书号。rating:等级。comments:评论。

有了这个 DTD,就可以编写 XML 文件了。
< ?xml version="1.0" encoding="utf-8" ?>
< !DOCTYPE library SYSTEM "library.dtd">
< library>
< !-- begin book entry -->
< book>
< title>XML:In Record Time< /title>
< author>Natanya Pitts< /author>
< publisher>SYBEX< /publisher>
< cover type="paperback" />
< category class="technology" />
< isbn>7-5053-5550-3< /isbn>
< rating number="1" />
< comments>
A very good book on XML.
< /comments>
< /book>
< book>
< title>Principles of Web Design< /title>
< author>Joel Sklar< /author>
< publisher>COURSE< /publisher>
< cover type="paperback" />
< category class="technology" />
< isbn>7-111-08237-0< /isbn>
< rating number="1" />
< comments>
A very good book on WEB design.
< /comments>
< /book>
< !-- end book entry -->
< /library>

将文件保存为 books.xml。
在这个 XML 文件中使用 library.dtd 中定义的语法包含了两本书。注意,为了使帖子里的 XML 文本能够显示,我给每个标记的 < 后面加了一个空格,你可不要拿来直接用哟。

使用 nsgmls 测试一下 XML 文件的格式是否正确:
nsgmls -wxml -wno-valid -s books.xml
如果没有任何输出,说明格式是正确的,然后就可以做 DTD 验证了:
nsgmls -wxml -s books.xml
如果也没有任何输出,那么 DTD 验证也通过了。

或者也可以使用 Xerces 做 DTD 验证,详情见我发的另一篇帖子:介绍一下做 Schema 验证和 DTD 验证的方法。

下一步是提供一个与这个 DTD 相对应的 Schema,并且编写一个使用 Schema 的 XML 文件。因为我相信 Schema 是比 DTD 更好的定义 XML 语法的方法,所以以后我举的例子里会主要讲使用 Schema 的方法。

在上次的例子中,我们建立了 DTD,并且使用这个 DTD 编写了 XML 文件。下面我讲讲建立与 DTD 对等的 Schema 和使用 Schema 编写 XML 文件的方法。

首先我要定义一个 Schema。
< ?xml version="1.0" encoding="utf-8" ?>
< xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
targetNamespace="http://localhost"
xmlns="http://localhost"
elementFormDefault="qualified">
< xsd:element name="library">
< xsd:complexType>
< xsd:sequence>
< xsd:element name="book" minOccurs="0" maxOccurs="unbounded">
< xsd:complexType>
< xsd:sequence>
< xsd:element name="title" type="xsd:string" minOccurs="1" maxOccurs="1"/>
< xsd:element name="author" type="xsd:string" minOccurs="1" maxOccurs="1"/>
< xsd:element name="publisher" type="xsd:string" minOccurs="1" maxOccurs="1"/>
< xsd:element name="cover" minOccurs="1" maxOccurs="1">
< xsd:complexType>
< xsd:attribute name="type">
< xsd:simpleType>
< xsd:restriction base="xsd:string">
< xsd:enumeration value="hardback"/>
< xsd:enumeration value="paperback"/>
< /xsd:restriction>
< /xsd:simpleType>
< /xsd:attribute>
< /xsd:complexType>
< /xsd:element>
< xsd:element name="category" minOccurs="1" maxOccurs="1">
< xsd:complexType>
< xsd:attribute name="class">
< xsd:simpleType>
< xsd:restriction base="xsd:string">
< xsd:enumeration value="entertainment"/>
< xsd:enumeration value="technology"/>
< /xsd:restriction>
< /xsd:simpleType>
< /xsd:attribute>
< /xsd:complexType>
< /xsd:element>
< xsd:element name="isbn" type="xsd:string" minOccurs="1" maxOccurs="1"/>
< xsd:element name="rating" minOccurs="1" maxOccurs="1">
< xsd:complexType>
< xsd:attribute name="number">
< xsd:simpleType>
< xsd:restriction base="xsd:string">
< xsd:enumeration value="1"/>
< xsd:enumeration value="2"/>
< xsd:enumeration value="3"/>
< xsd:enumeration value="4"/>
< xsd:enumeration value="5"/>
< /xsd:restriction>
< /xsd:simpleType>
< /xsd:attribute>
< /xsd:complexType>
< /xsd:element>
< xsd:element name="comments" type="xsd:string" minOccurs="0" maxOccurs="1"/>
< /xsd:sequence>
< /xsd:complexType>
< /xsd:element>
< /xsd:sequence>
< /xsd:complexType>
< /xsd:element>
< /xsd:schema>

将文件保存为 library.xsd。
这个 Schema 与上次建立的 DTD 提供完全相同的功能。有了这个 Schema,就可以编写 XML 文件了。
< ?xml version="1.0" encoding="utf-8" ?>
< library xmlns="http://localhost"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema-instance"
xsd:schemaLocation="http://localhost library.xsd">
< !-- begin book entry -->
< book>
< title>XML:In Record Time_~._< /title>
< author>Natanya Pitts< /author>
< publisher>SYBEX< /publisher>
< cover type="paperback" />
< category class="technology" />
< isbn>7-5053-5550-3< /isbn>
< rating number="1" />
< comments>
A very good book on XML.
< /comments>
< /book>
< book>
< title>Principles of Web Design< /title>
< author>Joel Sklar< /author>
< publisher>COURSE< /publisher>
< cover type="paperback" />
< category class="technology" />
< isbn>7-111-08237-0< /isbn>
< rating number="1" />
< comments>
A very good book on WEB design.
< /comments>
< /book>
< !-- end book entry -->
< /library>

将文件保存为 books-schema.xml。
在这个 XML 文件中使用 library.xsd 中定义的语法包含了两本书。

使用 XSV 做一下 Schema 验证:
xsv books-schema.xml
如果没有任何错误产生,Schema 验证就通过了。

或者也可以使用 Xerces 做 Schema 验证,详情见我发的另一篇帖子:介绍一下做 Schema 验证和 DTD 验证的方法。

Schema 最新的建议是 2001-03-16 的版本,但是目前包括 Xerces 在内的大部份可用的工具只支持 2000-10-24 的版本。所以为了使用这些工具来学习,目前请暂时先停留在这个老版本上。而最新的 XSV 已经可以支持 2001-03-16 这个新版本了。

关于 Schema,Roger L. Costello 先生写了一些非常好的教程,其中包括大量的例子可以参考,不怕你学不会。在:http://www.xfront.com

下一步是为编写好的 XML 文件提供一个 XSL 样式单,以便在 Mozilla 中显示。
原文地址:https://www.cnblogs.com/end/p/1943176.html