XML_DTD

来源:互联网 发布:lua 脚本 java 编辑:程序博客网 时间:2024/06/06 01:20
一  XML约束
    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
    
    需要XML约束的原因
    xml由于是可扩展的标记语言,所以在xml文件中的编写太过于自由,这样在很多种情况下并不合适。
    
    常用的约束技术
    XML DTD
        DTD文件的后缀名为 .dtd
        DTD文件有自己独立的语法规范
    XML Schema
        Schema文件的后缀名为 .xsd
        Schema文件符合xml语法规范

二  DTD Document Type Define
    DTD的定义:描述元素、属性和其他杂项在xml文档中的使用规则的说明

    DTD的分类:外部的DTD 内部的DTD 混合的DTD
        1).内部的DTD:DTD和xml文档在同一个文件中
        例如:
        student1.xml文件:
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE students[
            <!ELEMENT students (stu+)>
            <!ELEMENT stu (id,name,age)>
            <!ELEMENT id   (#PCDATA)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age  (#PCDATA)>
        ]>
        <students>
            <stu>
                <id>1</id>
                <name>tom</name>
                <age>20</age>
            </stu>
        </students>

        2).外部的DTD:DTD和xml文档不在同一个文件中
        例如:
        xml/student2.xml文件
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE students SYSTEM "../dtd/student.dtd">
        <students>
            <stu>
                <id>1</id>
                <name>tom</name>
                <age>20</age>
            </stu>
        </students>
        dtd/student.dtd文件:
        <!ELEMENT students (stu+)>
        <!ELEMENT stu (id,name,age)>
        <!ELEMENT id   (#PCDATA)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age  (#PCDATA)>

        3).混合的DTD:既有外部DTD,又有内部DTD
        例如:
        xml/student3.xml文件
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE students SYSTEM "../dtd/student.dtd"[
            <!ELEMENT stu (id,name,age)>
            <!ELEMENT id   (#PCDATA)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age  (#PCDATA)>
        ]>
        <students>
            <stu>
                <id>1</id>
                <name>tom</name>
                <age>20</age>
            </stu>
        </students>

        dtd/student.dtd文件:
        <!ELEMENT students (stu+)>
    

    外部的DTD
        引用外部dtd的时候又分为俩种:
        SYSTEM表示引用的dtd文件在本地
        例如:
        <!DOCTYPE students SYSTEM "../dtd/student.dtd">

        PUBLIC表示引用的dtd文件是一个公共的文件
        格式:注意里面是可以加回车换行的
        <!DOCTYPE 根元素 PUBLIC "" "">
        例如:
        <!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
        
        在后面的"如何在Eclipse中给xml文件添加标签自动提示功能"的部分再做说明


    DTD的目的:
        验证该xml文档是否是有效的xml文档
        如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
        注意:良构 不一定  有效,但是有效一定良构
    

    DTD对xml文件中元素的约束:
        格式:<!ELEMENT  元素名 (内容模式)>
        内容模式:
            1).EMPTY:元素不能包含子元素和文本(空元素)
            例如:
            dtd文件:
            <!ELEMENT students (stu)>
            <!ELEMENT stu EMPTY>
            xml文件:
            <students>
                <!--这个stu元素中的内容必须为空-->
                <stu></stu>
            </students>

            2).(#PCDATA):可以包含任何字符数据,但是不能在其中包含任何子元素
            例如:
            dtd文件:
            <!ELEMENT students (stu)>
            <!ELEMENT stu (#PCDATA)>
            xml文件:
            <students>
                <stu>tom</stu>
            </students>

            3).ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
            例如:
            dtd文件:
            <!ELEMENT students (stu)>
            <!ELEMENT stu ANY>
            xml文件:
            <students>
                <stu>tom</stu>
            </students>
            或者
            <students>
                <stu>
                    <name>tom</name>
                </stu>
            </students>
            

            4).修饰符:() | + * ? , 默认修饰符
            () 来给元素分用组

            |  在列出的元素中选择一个
                例如:
                dtd文件:
                <!ELEMENT students (stu|student)>
                xml文件:
                <students>
                    <!--这里只能出现stu元素或者student元素-->
                    <!--俩个元素任选其一,不能同时出现-->
                </students>

            +  该元素最少出现一次,可以出现多次 (1或n次)
                例如:
                dtd文件:
                <!ELEMENT students (stu+)>
                xml文件:
                <students>
                    <stu></stu>
                    <stu></stu>
                    <stu></stu>
                </students>

            *  该元素允许出现零次到任意多次(0到n次)
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                xml文件:
                <students>
                    <!--stu出现0次到n次-->
                    <stu></stu>
                    <stu></stu>
                    <stu></stu>
                </students>

            ?  该元素可以出现,但只能出现一次 (0到1次)
                例如:
                dtd文件:
                <!ELEMENT students (stu?)>
                xml文件:
                <students>
                    <!--stu出现0次到1次-->
                    <stu></stu>
                </students>

            ,  对象必须按指定的顺序出现
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (id,name,age)>
                xml文件:
                <students>
                    <stu>
                        <id></id>
                        <name></name>
                        <age></age>
                    </stu>
                </students>

            默认修饰符 就是什么修饰符都没有加
                例如:
                dtd文件:
                <!ELEMENT students (stu)>
                xml文件:
                <students>
                    <!--这里只能出现stu元素1次-->
                    <!--stu元素不出现也验证不通过-->
                    <stu></stu>
                </students>
        

            5).混合元素 子元素是任意类型 出现任意次数 并且没有出现顺序要求
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA|id|name|age)*>
                xml文件:
                <students>
                    <stu></stu>
                    <stu>
                        <id></id>
                        <name></name>
                        <age></age>
                    </stu>
                    <stu>tom</stu>
                </students>
                注意:
                1 根元素students里面可以出现stu子元素0到n次
                2 stu元素中可以写文本也可以写id、name、age子元素
                3 id、name、age子元素出现的顺序没有要求
                4 id、name、age子元素可以都出现也可以都不出现


        注意:浏览器是非验证的解析器,不会验证xml的有效性
              可以使用Eclipse去验证xml的有效性

    
    DTD对xml文件中属性的约束:
        格式:<!ATTLIST 元素名称
                    属性名称    值类型    属性特点
                    属性名称    值类型    属性特点
              >

        属性类型:
            1).CDATA:属性值可以是任何字符(包括数字和中文)
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        id   CDATA #REQUIRED
                        name CDATA #REQUIRED
                    >
                xml文件:
                <students>
                    <stu id="1" name="tom"></stu>
                </students>

            2).ID:属性值必须唯一,属性值必须满足xml命名规则
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        id   ID    #REQUIRED
                        name CDATA #REQUIRED
                    >
                xml文件:
                <students>
                    <stu id="A1" name="tom"></stu>
                    <stu id="B1" name="tom"></stu>
                </students>
                注意:
                    1. id和name属性必须出现
                    2. id属性的值必须满足xml名字规范,例如不能数字开头
                    3. id属性的值不能重复
                    4. 多个属性的出现是没有顺序要求的

            3).IDREF/IDREFS
                IDREF属性的值指向文档中其它地方声明的ID类型的值。
                IDREFS同IDREF,但是可以具有由空格分开的多个引用。

                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        id   ID            #REQUIRED
                        pid  IDREFS     #IMPLIED
                        name CDATA        #REQUIRED
                    >
                xml文件:
                <students>
                    <stu id="A1" name="tom"></stu>
                    <stu id="B1" name="tom"></stu>
                    <stu id="C1" name="tom" pid="A1 B1"></stu>
                </students>
                注意:
                    1. id和name属性必须出现
                    2. pid属性出现可以,不出现也可以
                    3. id属性的值必须满足xml名字规范,例如不能数字开头
                    4. id属性的值不能重复
                    5. pid属性的值必须是引用其他stu元素的id值
                    6. pid属性的值可以是多个,使用空格隔开
                    7. 多个属性的出现是没有顺序要求的

            4).enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        id     ID            #REQUIRED
                        name   CDATA         #REQUIRED
                        gender (男|女)         #REQUIRED
                    >
                xml文件:
                <students>
                    <stu id="A1" name="tom" gender="男"></stu>
                    <stu id="B1" name="tom" gender="女"></stu>
                </students>
                注意:
                    1. id/name/gender属性必须出现
                    2. id属性的值必须满足xml名字规范,例如不能数字开头
                    3. id属性的值不能重复
                    4. gender属性的值必须是男或者女
                    5. 多个属性的出现是没有顺序要求的

        属性特点:
            1).#REQUIRED:元素的所有实例都必须有该属性
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        name   CDATA   #REQUIRED
                    >
                xml文件:
                <students>
                    <stu name=""></stu>
                    <stu name="tom"></stu>
                </students>
                注意:
                    1. name属性必须出现
                    2. name属性的值可以为空也可以不为空

            2).#IMPLIED :属性可以不出现
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        name   CDATA   #IMPLIED
                    >
                xml文件:
                <students>
                        <stu name=""></stu>
                        <stu name="tom"></stu>
                        <stu></stu>
                </students>
                注意:
                    1. name属性可以出现也可以不出现
                    2. name属性的值可以为空也可以不为空

            3).default-value:属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是atttibute-value
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        name   CDATA   "tom"
                    >
                xml文件:
                <students>
                        <stu name="zhangsan"></stu>
                        <stu></stu>
                </students>
                注意:
                    1. name属性可以出现也可以不出现
                    2. name属性如果不出现则默认值为tom

            4).#FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                <!ELEMENT stu (#PCDATA)>
                    <!ATTLIST stu
                        name   CDATA   #IMPLIED
                        school CDATA   #FIXED "briup"
                    >
                xml文件:
                <students>
                        <stu school="briup"></stu>
                        <stu></stu>
                </students>
                注意:
                    1. name/school属性可以出现也可以不出现
                    2. school属性如果出现那么值一定要是briup

        
    DTD文档的一个实例:
        dtd文档:
        <!ELEMENT students (student+)>
        <!ELEMENT student (name,age?,score*)>
            <!ATTLIST student id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
            <!ATTLIST name firstName CDATA #IMPLIED>
        <!ELEMENT age (#PCDATA)>
            <!ATTLIST age xuAge CDATA #FIXED "20">
        <!ELEMENT score (#PCDATA)>
            <!ATTLIST score sel (60|80|100) #REQUIRED>

    
    利用DTD文件在Eclipse中给xml文件添加标签自动提示功能
    
    
    利用schame文件在Eclipse中给xml文件添加标签自动提示功能
    


三 XML的解析
    (一)SAX解析
        SAX:基于事件处理的机制
            sax解析xml文件时,遇到开始标签,结束标签,开始解析文件,文件解析结束,字符内容,空白字符等都会触发各自的方法。

        优点:
            适合解析大文件,对内存要求不高
            轻量级的解析数据方式,效率更高  
        缺点:
            不能随机解析
            不能修改XML文件,只能进行查询

    (二)DOM解析:
        采用dom解析,会将xml文档全部载入到内存当中,然后将xml文档
    中的所有内容转换为tree上的节点(对象)。
        优点:    
            可以随机解析
            可以修改文件
            可以创建xml文件
        缺点:
            适合解析小文件,对内存要求高


-------------------------------------------


XML解析分为:dom解析和sax解析
dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准(相当于是一个民间标准),几乎所有的 XML 解析器都支持它。

dom和sax都是一种模型/标准/理论,是需要其他人使用具体的代码去实现的

xml解析器就是用来对dom或者sax解析标准的具体实现

XML解析器
sun公司的解析器Crimson
IMB公司的解析器Xerces        已经捐献给apache组织
dom4j组织的解析器Aelfred2


sun公司根据自己的解析器推出了解析xml的API   Jaxp
    Java API for XMLProcessing,意为XML处理的Java API

dom4j组织根据自己的解析器推出了解析xml的API dom4j
    dom4j是一个Java解析XML的API,


原创粉丝点击