XML约束之DTD

作者: onweer | 来源:发表于2016-03-02 13:24 被阅读275次

    为什么要有XML约束?

    虽然XML本身具有比HTML更加严格的语法审查,但是XML没有,也不可能有针对每个用户定义标签的内容语法规定。

    比如<age>-1</age> 这样明显的语法错误.XML约束出现就为了解决这种问题。

    XML约束技术

    1. DTD约束.
    2. Schema约束.

    |DTD|Schema|
    |:-:|:-:|:-:|
    |语法简单,功能简单|语法负责,功能复杂|

    DTD语法:

    w3c的一个Demo:

    <?xml version="1.0"?>
    <!DOCTYPE note [
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to      (#PCDATA)>
      <!ELEMENT from    (#PCDATA)>
      <!ELEMENT heading (#PCDATA)>
      <!ELEMENT body    (#PCDATA)>
    ]>
    <note>
      <to>George</to>
      <from>John</from>
      <heading>Reminder</heading>
      <body>Don't forget the meeting!</body>
    </note>
    

    外部DTD(本地导入)

    假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
    <!DOCTYPE 根元素 SYSTEM "文件名">
    一个例子:

    note.dtd
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to      (#PCDATA)>
    <!ELEMENT from    (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body    (#PCDATA)>
    
    ---
    note.xml
    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
      <to>George</to>
      <from>John</from>
      <heading>Reminder</heading>
      <body>Don't forget the meeting!</body>
    </note>
    
    

    外部DTD(公共导入)

    <!DOCTYPE 根元素 PUBLIC "http://google.com/xxx.dtd">

    约束标签

    <!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>

    (#PCDATA)

    代表普通字符串,不能包含子标签

    ANY

    代表任何内容

    EMPTY

    代表必须为空

    (子元素名称1,子元素名称2,...)

    <!ELEMENT note (to,from,heading,body)>
    代表我的note标签下,一定按顺序出现to标签,from标签,...
    规定标签一定出现一次

    (子元素名称1+)

    <!ELEMENT note (to+,from,heading,body)>
    代表to标签至少出现一次,可以多次

    (子元素名称1*)

    <!ELEMENT note (to,from*,heading,body)>
    代表from标签出现0次或多次

    (子元素名称1?)

    <!ELEMENT note (to,from,heading?,body)>
    代表heading标签0次或1次

    约束属性

    属性声明使用下列语法:

    <!ATTLIST 元素名称 属性名称 属性类型 默认值>

    DTD 实例:

    <!ATTLIST payment type CDATA "check">

    默认值参数可使用下列值:

    值          属性的默认值
    #REQUIRED     属性值是必需的
    #IMPLIED      属性不是必需的
    #FIXED value    属性值是固定的

    #REQUIRED

    <!ATTLIST to ip CDATA #REQUIRED>

    属性类型

    CDATA :      表示普通字符串
    (en1|en2|...)    枚举,表示一定任选其中的一个值
    ID         值为唯一的 id(不能数字开头)
    ---------------------------------------
    IDREF         值为另外一个元素的 id
    IDREFS        值为其他 id 的列表
    NMTOKEN        值为合法的 XML 名称
    NMTOKENS        值为合法的 XML 名称的列表
    ENTITY        值是一个实体
    ENTITIES         值是一个实体列表
    NOTATION        此值是符号的名称
    xml:          值是一个预定义的 XML 值
    

    报纸文章 DTD

    拷贝自:http://www.vervet.com/

    <!DOCTYPE NEWSPAPER [ 
    
    <!ELEMENT NEWSPAPER (ARTICLE+)>
    <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
    <!ELEMENT HEADLINE (#PCDATA)>
    <!ELEMENT BYLINE (#PCDATA)>
    <!ELEMENT LEAD (#PCDATA)>
    <!ELEMENT BODY (#PCDATA)>
    <!ELEMENT NOTES (#PCDATA)> 
    
    <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
    <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
    <!ATTLIST ARTICLE DATE CDATA #IMPLIED>
    <!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
    
    <!ENTITY NEWSPAPER "Vervet Logic Times">
    <!ENTITY PUBLISHER "Vervet Logic Press">
    <!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
    
    ]>
    

    相关文章

      网友评论

        本文标题:XML约束之DTD

        本文链接:https://www.haomeiwen.com/subject/szvikttx.html