XML定义文档内容

转载 2006年06月07日 11:14:00

DTD 允许您指定 XML 文档的基本结构。下面的几页将研究 DTD 片段。首先是定义本章中地址文档示例的基本结构的 DTD。

<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>

该 DTD 定义了样本文档中使用的所有元素。它定义了三个元素:

  • <address> 元素包含一个 <name>、一个 <street>、一个 <city>、一个 <state> 和一个 <postal-code>。所有这些元素必须出现,而且必须以这个顺序出现。
  • <name> 元素包含一个可选的 <title> 元素(问号表示 title 这个元素是可选的),后面跟有一个 <first-name> 和一个 <last-name> 元素。
  • 所有其它包含文本的元素。(#PCDATA 代表已解析字符数据;不能在这些元素中包含另一个元素。)

尽管 DTD 相当简单,但它清楚地说明了什么样的元素组合是合乎规则的。<postal-code> 元素在 <state> 元素之前的地址文档是不合乎规则的,没有 <last-name> 元素的文档也不合乎规则。

另外,请注意,DTD 语法不同于普通的 XML 语法。(相反,XML Schema 文档本身就是 XML,这导致一些有趣的结果)。尽管 DTD 的语法不同,但您仍可以将普通的注释放到 DTD 中。

DTD 中的符号

DTD 中有几个符号用于指出某元素在 XML 文档中可能会出现多少次(或是否出现)。下面是一些示例及其含义:

  • <!ELEMENT address (name, city, state)>

    <address> 元素必须包含一个 <name> 元素、一个 <city> 元素和一个 <state> 元素,并且符合上面的次序。所有的元素都是必需的。逗号表示项的列表。

  • <!ELEMENT name (title?, first-name, last-name)>

    这意味着 <name> 元素包含一个可选的 <title> 元素,后面必须跟有一个 <first-name> 和一个 <last-name> 元素。问号表示这一项是可选的;它可以出现一次或根本不出现。

  • <!ELEMENT addressbook (address+)>

    <addressbook> 元素包含一个或多个 <address> 元素。您可以有任意多的 <address> 元素,但必须至少有一个。加号表示这一项必须至少出现一次,但可出现任意次。

  • <!ELEMENT private-addresses (address*)>

    <private-addresses> 元素包含零个或多个 <address> 元素。星号表示这一项可以出现任意次,包括零次。

  • <!ELEMENT name (title?, first-name, (middle-initial | middle-name)?, last-name)>

    <name> 元素包含一个可选的 <title> 元素,后面跟有一个 <first-name> 元素,随后可能跟有一个 <middle-initial><middle-name> 元素,然后跟有一个 <last-name> 元素。换句话说,<middle-initial><middle-name> 都是可选的,而且您只能选择二者中的一个。竖线符号表示选择列表;您只能从列表选择一项。还要注意该示例用圆括号对特定元素进行分组,然后在这个组旁放上问号。

  • <!ELEMENT name ((title?, first-name, last-name) | (surname, mothers-name, given-name))>

    这个 <name> 元素可以包含两个序列中的一个:一个可选的 <title>,后面跟有一个 <first-name> 和一个 <last-name>;或一个 <surname>、一个 <mothers-name> 和一个 <given-name>

如要定义一个 XML 文档的结构,您应该象在应用程序中设计数据库模式或数据结构那样事先考虑 DTD 或模式。您事先考虑的未来需求越多,以后实现它们就越容易而且成本越低

定义属性

  • 定义哪些属性是必需的
  • 定义属性的缺省值
  • 列出给定属性的所有有效值

假设您要更改 DTD,使 state 成为 <city> 元素的属性。下面演示如何做到这一点:


<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA #REQUIRED>
          

和以前一样,我们定义了 <city> 元素,但修改的示例还使用了 ATTLIST 声明来列出元素的属性。属性列表中的名称 city 告诉解析器这些属性是为 <city> 元素定义的。名称 state 是属性的名称,关键字 CDATA#REQUIRED 告诉解析器 state 属性包含文本并且是必需的(如果它是可选的,用 CDATA #IMPLIED 即可)。

要定义元素的多个属性,可象下面那样编写 ATTLIST


<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA #REQUIRED
               postal-code CDATA #REQUIRED>
          

该示例将 statepostal-code 都定义为 <city> 元素的属性。

最后,DTD 允许您定义属性缺省值,并列举属性的所有有效值:


<!ELEMENT city (#PCDATA)>
<!ATTLIST city state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
          

上面的示例表明它仅支持来自亚利桑那州(AZ)、加利福尼亚州(CA)、内华达州(NV)、俄勒冈州(OR)、犹他州(UT)和华盛顿州(WA)的地址,并且缺省值是加利福尼亚州。这样,您就可以进行形式非常有限的数据验证。

XML 模式

XML 模式使用 XML 语法。换句话说,XML 模式是一个 XML 文档。这意味着您可以象处理任何其它文档一样处理模式。例如,您可以编写一个 XSLT 样式表,该样式表将 XML 模式转换成具有自动生成的 JavaScript 代码的 Web 表单,其中的 JavaScript 代码可以验证您输入的数据。 XML 模式支持数据类型。尽管 DTD 确实支持数据类型,但很明显这些数据类型是从发布的角度开发的。XML 模式支持 DTD 中的所有原始数据类型(诸如标识和标识引用之类的类型)。它们还支持整数、浮点数、日期、时间、字符串、URL 和其它对数据处理和验证有用的数据类型。 XML 模式是可扩展的。除了 XML 模式规范中定义的数据类型以外,您还可以创建自己的数据类型,并且可以基于其它数据类型派生出新的数据类型。 XML 模式有更强的表达能力。例如,您可以用 XML 模式定义任何 <state> 属性值不得超过 2 个字符,或定义任何 <postal-code> 元素的值必须与正则表达式 [0-9]{5}(-[0-9]{4})? 相匹配。

下面是与原始名称和地址 DTD 相匹配的 XML 模式。它增加了两个约束:<state> 元素的值必须刚好是两个字符长,<postal-code> 元素的值必须与正则表达式 [0-9]{5}(-[0-9]{4})? 相匹配。尽管这个模式比 DTD 长很多,但它更清楚地表达了有效的文档看起来是什么样子。下面是模式:


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="address">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="name"/>
        <xsd:element ref="street"/>
        <xsd:element ref="city"/>
        <xsd:element ref="state"/>
        <xsd:element ref="postal-code"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="name">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="title" minOccurs="0"/>
        <xsd:element ref="first-Name"/>
        <xsd:element ref="last-Name"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="title"      type="xsd:string"/>
  <xsd:element name="first-Name" type="xsd:string"/>
  <xsd:element name="last-Name"  type="xsd:string"/>
  <xsd:element name="street"     type="xsd:string"/>
  <xsd:element name="city"       type="xsd:string"/>

  <xsd:element name="state">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:length value="2"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

  <xsd:element name="postal-code">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
</xsd:schema>
XML 模式用  元素定义了一些 XML 元素。头两个定义的元素()由其它元素组成。 元素定义了包含在这两个元素中的元素的序列。下面是示例:

<xsd:element name="address">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="name"/>
      <xsd:element ref="street"/>
      <xsd:element ref="city"/>
      <xsd:element ref="state"/>
      <xsd:element ref="postal-code"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
          

与 DTD 版本一样,XML 模式示例定义 <address> 包含一个 <name>、一个 <street>、一个 <city>、一个 <state> 和一个 <postal-code> 元素,并且依照上面的次序。请注意,该模式实际上用 <xsd:complexType> 元素定义了新的数据类型。

大多数元素包含文本;定义它们很简单。您只要声明新的元素,然后指定它的数据类型为 xsd:string


<xsd:element name="title"      type="xsd:string"/>
<xsd:element name="first-Name" type="xsd:string"/>
<xsd:element name="last-Name"  type="xsd:string"/>
<xsd:element name="street"     type="xsd:string"/>
<xsd:element name="city"       type="xsd:string"/>
定义模式中的元素内容

样本模式为两个元素的内容定义了约束:<state> 元素的内容必须是两个字符长,而 <postal-code> 元素的内容必须与正则表达式 [0-9]{5}(-[0-9]{4})? 匹配。下面演示如何做到那一点:


  <xsd:element name="state">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:length value="2"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

  <xsd:element name="postal-code">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
          

对于 <state><postal-code> 元素,模式用约束定义了新的数据类型。第一个情况使用 <xsd:length> 元素,而第二个情况则使用 <xsd:pattern> 元素定义该元素必须匹配的正则表达式。

XML编程

-
  • 1970年01月01日 08:00

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

a: 两种定义形式 dtd(文档类型定义)  schema(XML模式); b: XML Schema和DTD都用于文档验证,但二者还有一定区别,本质区别:schema本身是xml的,可以被XML...
  • freekiteyu
  • freekiteyu
  • 2013-05-28 08:11:42
  • 6588

XML文档类型定义---XML Schema结构

5.1 Schema概述XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具。 使用DTD虽然带...
  • new___Smile
  • new___Smile
  • 2016-06-28 11:32:07
  • 6624

SAX Xml->SAXParseException在文档的元素内容中找到无效的 XML 字符 (Unicode: 0x10)

在用SAX解析xml时,遇到文件中含unicode字符,则会抛出SAXParseException。 Spring in Action 45.0 ...
  • echo_oy
  • echo_oy
  • 2017-10-17 09:23:52
  • 335

无法显示 XML 页,文档的顶层无效。

无法显示 XML 页。  无法查看使用 样式表的 XML 输入。请更正错误然后单击 刷新 按钮,或稍后重试。  --------------------------------------...
  • lushuaiyin
  • lushuaiyin
  • 2013-03-19 14:06:06
  • 4045

XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?

XML文档定义方式:有两种定义形式,dtd文档类型定义和schema模式本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)普通区别:1.sche...
  • qq_28061489
  • qq_28061489
  • 2018-03-06 22:54:00
  • 60

解析XML文件时,无效的XML 字符 (Unicode: 0x7)异常处理

在最近的工作中需要使用XML文件做数据存储,由于此XML文件的内容是不同的数据来源的数据,在解析XML文件时,遇到几处相似的异常:无效的XML字符 (Unicode: 0x7), (Unicode...
  • u011823494
  • u011823494
  • 2016-07-19 17:48:47
  • 6262

无法显示 XML 页,文档的顶层无效

用ASP.NET、ajax做个WEB系统,浏览器测试环境是firefox。然而用ie 6.0测试时,后台返回给浏览器的结果与预期的不一样,多了一些代码“无法显示 XML 页。 无法查看使用 样式表...
  • handsometone1982
  • handsometone1982
  • 2016-09-08 09:42:57
  • 1310

xml 学生管理系统

  • 2012年12月31日 13:11
  • 495KB
  • 下载

xml 文档定义

  • 2012年10月21日 23:31
  • 25KB
  • 下载
收藏助手
不良信息举报
您举报文章:XML定义文档内容
举报原因:
原因补充:

(最多只允许输入30个字)