订单查询 购书指南 购物车 收藏  
    首页 热点专题 精确搜索 精品推荐 俱乐部论坛 下载服务 走近科海 征稿专栏 新书预告 各地经销商 特价直销
  11.2 文档类型定义(DTD)和XML方案

    通常有两种与XML文档关联的实体,如下所示:
  • 文档类型定义(DTD,Document Type Definition)
  • XML方案(Schema)
    本节将尝试着更详细地理解DTD。

11.2.1 文档类型定义(DTD)

    一个DTD担当XML文档的一个文法的作用。它制定了关联XML文档应该遵循的可靠规范。考虑一个保险应用系统的例子。 现在假定一个应用系统需要把保险数据发送给另外一个应用系统。在这种情况下,因为将要在系统间传送的数据是自描述的, 因此采用XML就是一种很好的选择。
    程序清单11.3里显示了将要在不同应用系统间传送的XML文件。
    程序清单11.3:Insurance.xml
<?xml version = "1.0"?>
<!DOCTYPE INSURANCE_CLAIM SYSTEM "insurance.dtd">
<INSURANCE_CLAIM>
<INSURANCE_TYPE>Medical</INSURANCE_TYPE>
<INSURANCE_AMOUNT CurrencyType="CADollars">4000</INSURANCE_AMOUNT>
<CUSTOMER_NAME><FIRST_NAME>John</FIRST_NAME>
<MIDDLE_NAME>A</MIDDLE_NAME>
<LAST_NAME>Doe</LAST_NAME>
</CUSTOMER_NAME>
<CUSTOMER_ADDRESS>
<HOUSE_NO>5520</HOUSE_NO>
<STREET_ADDRESS>Avenue Road</STREET_ADDRESS>
<CITY_NAME>San Francisco</CITY_NAME>
<COUNTRY_NAME>United States</COUNTRY_NAME>
</CUSTOMER_ADDRESS>
</INSURANCE_CLAIM>
    程序清单11.4显示了Insurance.xml依附的DTD。
    程序清单11.4:Insurance.dtd
<!ELEMENT INSURANCE_CLAIM(INSURANCE_TYPE?,INSURANCE_AMOUNT?,CUSTOMER_NAME?,CUSTOMER_ADDRESS?)>
<!ELEMENT CUSTOMER_NAME(FIRST_NAME,MIDDLE_NAME?,LAST_NAME)>
<!ELEMENT CUSTOMER_ADDRESS(HOUSE_NO,STREET_ADDRESS*,CITY_NAME,COUNTRY_NAME)>
<!ELEMENT INSURANCE_TYPE(#PCDATA)>
<!ELEMENT INSURANCE_AMOUNT(#PCDATA)>
<!ATTLIST INSURANCE_AMOUNT CurrencyType(CADollars | Francs | Marks | Pesos | UKPounds | USDollarsINDRupees) 'USDollars'>
<!ELEMENT FIRST_NAME(#PCDATA)>
<!ELEMENT MIDDLE_NAME(#PCDATA)>
<!ELEMENT LAST_NAME(#PCDATA)>
<!ELEMENT HOUSE_NO(#PCDATA)>
<!ELEMENT STREET_ADDRESS(#PCDATA)>
<!ELEMENT CITY_NAME(#PCDATA)>
<!ELEMENT COUNTRY_NAME(#PCDATA)>
    DTD文件为XML文档指定一个结构。这类似于一个要求所有数据库表中的记录都按照一定的规则存储的数据库方案。一个DTD文件的组成如下。

11.2.1.1 元素

    元素(Elements)是DTD的一个基本块。一个元素至少有一个名字和一个它可以容纳各种内容的定义。元素可以如下声明:
<!ELEMENT ElementName Contentmodel>
    这里ElementName是元素的名称,Contentmodel详细说明元素的内容。
    有两种类型的元素,即基本元素和复合元素。一个DTD的复合元素可以按照另一个叫做子元素的元素来定义它们本身。例如,insurance.dtd文件里FIRST_NAME是一个简单元素,CUSTORMER_NAME是一个复合元素。
    一个元素可以包含以下类型的内容:
    Empty:当指定内容为空(empty)时,元素规范就像这样:
<!ELEMENT MyElement EMPTY>
    这就意味着不允许任何子元素和文本内容,只应该把它用作属性的一个容器。
    Any:当内容指定为Any时,元素规范就像这样:
<!ELEMENT MyElement ANY>
    元素可以包含任何东西。换句话说就是,DTD不需要确认内容的结构。应该尽可能地避免使用ANY,因为它完全毁坏了使用DTD的目的。
    PCDATA:元素只能够容纳一个文本串,不允许有子元素。PCDATA支持解析了的字符数据。看insurance.dtd文件,元素HOUSE_NO的定义是
<!ELEMENT HOUSE_NO(#PCDATA)>
    这里HOUSE_NO是一个基本元素。这个元素可以引用任何文本字符串数据。这由#PCDATA来展现。
    内容模板:一个带有内容模板的元素包含了形成此元素的子元素信息。这些信息包括诸如元素可以出现的顺序,子元素可以出现的次数和子元素是否是可选的或者强制性的等等信息。
    考虑一个复合元素如CUSTOMER_NAME。它被定义为
<CUSTOMER_NAME(FIRST_NAME,MIDDLE_NAME?,LAST_NAME)>
    这是一个复合元素,因为是按照不同的子元素也就是FIRST_NAME、MIDDLE_NAME和LAST_NAME定义的它。这些子元素是形成CUSTOMER_NAME的基本元素。
    应该注意到上面定义里“?”的存在。它表示在CUSTOMER_NAME里的MIDDLE_NAME的出现是可选的。如果它出现了,就只应该出现一次。
    下面的符号指示子元素的出现或者缺席以及它们可以出现的次数。
    1)“?”问号:这表明一个子元素是单值的和可选的(0到1)。那就是说子元素根本不用出现,而且如果出现的话,只能够出现一次。
    2)“*”星号:这表明子元素是多值的和可选的(0到多)。那就是说,子元素根本不用出现,而且如果出现的话,它可以出现多次。
    3)“+”加号:这表明子元素是多值的和强制性的(1到多)。那就是说,子元素必须出现一次或者多次。

 

 
上一页   下一页
本书目录 本书前言 返回专题首页