• 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 中显示。
  • 相关阅读:
    C语言调试示例
    Tiff格式详解(转载)
    指纹
    twitter
    baidu
    NoSuchMethodError随记
    IllegalArgumentException异常
    Springboot2.2.9接入阿里云ES(带高亮查询)
    阿里云ECS安装cnpm
    阿里云ECS安装docker
  • 原文地址:https://www.cnblogs.com/end/p/1943176.html
Copyright © 2020-2023  润新知