DTD 如何校验 XML

来源:互联网 发布:网络老是断断续续 编辑:程序博客网 时间:2024/04/28 20:01

 我们可以利用DTD文件来规格化XML文件,并可以利用它来校验XML文件是否是规格化好的。它的原理如下:

 

【基本原理】

在DTD文件中详细规定好XML文件中所有可能出现的元素,并且元素的层次关系、元素的属性、元素的值的类型都是有详细的定义的。这就好比DTD是一个模版,而XML文件就是在这个模版下具体填入了相应的值。

 

【DTD声明子节点方式】

1、<!ELEMENT A ANY>
含义:A节点下可以包含任意节点类型,最简单的情况。

2、<!ELEMENT A (#PCDATA)>
含义:A节点只能包含文本信息。


3、<!ELEMENT A (B,C)>
含义:A节点可以而且必须包含B和C节点,并且B节点必须位于C节点之前。

4、<!ELEMENT A (B*,C)>
含义:A节点后面可以包含任意数目的B节点,然后紧跟着一个C节点。

5、<!ELEMENT A (B?,C+)*>
含义:这种情况比较复杂,先忽略最外层的*,B?表示可以有一个且最多一个B节点,然后至少一个C节点。 然后综合考虑最外层的*,这种组合可以重复出现的次数为0,1,2,....试着枚举一下,可能的情况: BC,BCC,...,C,CC,CCC,...,BBC,BBCC,BBCCC...,BCBC,BCBCBC,...,...

 

元字符定义:

元 字 符含    义+出现一次或多次*出现零次或多次?可选,不出现或出现一次()一组要共同匹配的表达式|OR,或,AND,要求严格遵从顺序要求元素A
元素B
元素C元素列表,无须遵从顺序要求

 

【DTD文件】

<!DOCTYPE 联系人列表[
        <!ELEMENT 联系人列表 (联系人)*
>
        
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
        
<!ELEMENT 地址 (街道,城市,省份)>
        
<!ELEMENT 姓名 (#PCDATA)>
        
<!ELEMENT ID (#PCDATA)>
        
<!ELEMENT 公司 (#PCDATA)>
        
<!ELEMENT EMAIL (#PCDATA)>
        
<!ELEMENT 电话 (#PCDATA)>
        
<!ELEMENT 街道 (#PCDATA)>
        
<!ELEMENT 城市 (#PCDATA)>
        
<!ELEMENT 省份 (#PCDATA)>

   ]>

 

【定义后XML】

<联系人列表>
    <联系人>

        <姓名>张三</姓名>
        <ID>001</ID>
        <公司>A公司</公司>
        <EMAIL>zhang@aaa.com</EMAIL>
        <电话>(010)62345678</电话>
        <地址>
             <街道>五街1234号</街道>
             <城市>北京市</城市>
             <省份>北京</省份>
        </地址>
    </联系人>

    <联系人>
        <姓名>李四</姓名>
        <ID>002</ID>
        <公司>B公司</公司>
        <EMAIL>li@bbb.org</EMAIL>
        <电话>(021)87654321</电话>
        <地址>
             <街道>南京路9876号</街道>
             <城市>上海</城市>
             <省份>上海</省份>
        </地址>
    </联系人>
</联系人列表>

 

【元素属性的定义】

元素的属性
 
在DTD中定义属性时,我们使用下面的格式:
 

<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
  • 必须赋值的属性
    关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。例如,假设你想定义一个"页面作者"元素,并把这个元素加入所有网站中的每一个页面。之所以定义这个元素,是为了页面编辑者能够提供他的联系信息,以便当发现页面错误或无效链接时,可以及时地通知他。在这种情况下,每个页面作者都有不同的个人信息,所以你无法事先知道应该用什么作为缺省值,但你又的确需要提供每个人的信息。这时候,你就可以把与联系信息相关的属性定义为必须的(REQUIRED),而且不用提供缺省值。
  • 属性值可有可无的属性
    当使用IMPLIED关键字时,文法解释器不再强行要求你在XML文件中给该属性赋值,而且也无须在DTD中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。
  • 固定取值的属性
    还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。
  • 定义缺省值的属性
    如果不使用上面任何一种关键字的话,该种属性就是属于这种类型。对于这种属性,你需要在DTD中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用DTD中给出的缺省值。

  视实际情况而选择,给出一个实际的例子: 

<!ATTLIST 页面作者 
        姓名 #CDATA #IMPLIED 
        年龄 #CDATA #IMPLIED 
        联系信息 #CDATA #REQUIRED 
        网站职务 #CDATA #FIXED "页面作者" 
        个人爱好 #CDATA "上网"

>

 

另外还有属性的类型:

  • CDATA
  • Enumerated
  • ID
  • IDREF
  • IDREFS
  • ENTITY
  • ENTITIES
  • NMTOKEN
  • NMTOKENS
  • NOTATION

    参数实体专门用在DTD中。定义方式是:

    <!ENTITY % 实体名 "实体内容">

    <!ENTITY % 实体名 SYSTEM "外部文件名">

    引用方式为: %实体名;
    使用参数实体,可以方便元素和属性的声明。例如:

    <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
    <!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
    <!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>

     

  • 原创粉丝点击