到目前为止,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 中显示。

posted on 2004-10-16 13:23  I love I think  阅读(1247)  评论(0编辑  收藏  举报