zoukankan      html  css  js  c++  java
  • XML DTD验证

    一、什么是DTD  

      文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
      DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

      

    二、DTD的作用

      1、有了DTD,每个XML可以携带一个自身格式的描述。

      2、有了DTD,不同组织可以使用一个通用的DTD来交换数据。

      3、应用程序中使用DTD校检从外部接受的XML数据是否有效。

      

    三、DTD中包含的内容

      1、元素的定义规则:在DTD中需要验证XML中能包含哪些元素。

      2、元素之间的关系规则:指元素的父元素是谁,元素和元素之间到底是上下层关系还是平行关系。

      3、属性的定义:可以规定在XML中属性名是什么,属性值是什么类型。

    四、DTD的分类:

      1、内部DTD文档:DTD文档和XML文档在同一个文件中。

        <!DOCTYPE 根元素 [定义内容]>

      2、外部DTD文档:DTD文档和XML文档保存在不同文件中。

        <!DOCTYPE 根元素 SYSTEM "DTD文件路径">

      3、内外结合的DTD文档:两种相结合的写法。

        <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

    五、DTD元素定义

      语法:

      <!ELEMENT NAME CONTENT>

      ELEMENT:关键字,表示声明一个DTD文档。

      NAME:元素名称,XML中元素的名称。

      CONTENT:元素类型,

      元素类型包括:EMPTY、#PCDATA、纯元素类型、ANY。

      1、Empty:

      该元素不能包含子元素和文本,但可以有属性(空元素)。

      语法: 

      <!ELEMENT 元素名称 EMPTY>

      例:声明一个空的student元素

      <!ELEMENT student empty>

      XML示例:

      <student />

      

      2、#PCDATA:

      可以包含任何字符数据,但不能包含其他子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

      语法:

      <!ELEMENT 元素名称 (#PCDATA)>

      例:声明一个name的元素

      <!ELEMENT name (#PCDATA)>

      XML示例:

      <name>张三</name>  

      3、纯元素类型:

      只能包含子元素,不能包含文本。元素出现的顺序必须和定义一致。

      语法:

      <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

      例:声明学生标记

      <!ELEMENT student(name,age)>

      XML示例:

      <student>

        <name>张三</name>

        <age>18</age>

      </student>


     符号的用途:
    符号 用途 示例 说明
    () 用来给元素分组 (古龙|金庸|梁羽生),(王朔|余杰),毛毛 分为三组
    | 在列出的对象中必须选择一个 (男人|女人) 表示男人或者女人必须出现,两者至少出现其一。
    , 对象必须按照指定的顺序出现 (西瓜,苹果,香蕉) 表示西瓜、苹果、香蕉必须出现,并且是按照指定顺序出现。
    * 该对象可以出现0次或者多次 (爱好*) 爱好可以出现0次到多次
    ? 该对象只能出现0到1次 (菜鸟?) 表示菜鸟可以出现0次到1次
    + 改对象可以出现1到多次。 (成员+) 表示成员必须出现1次到多次。


      4、ANY:

      可以包含任何元素类型。

      语法:  

      <!ELEMENT 元素名称 ANY>
      例子:
      <!ELEMENT student ANY>

      例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE studentlist [
        <!--声明根元素下可以包含多个student元素-->
        <!ELEMENT studentlist (student*)>
        <!--声明student下可以包含name,age,sex元素,name必须出现0-1次, age出现0-多次,sex必须出现1次 -->
        <!ELEMENT student (name?, age*, sex)>
        <!--声明name中只能包含文本,不能包含其他标记-->
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!--声明sex为空元素-->
        <!ELEMENT sex EMPTY>
    ]>
    <studentlist>
        <student>
            <name>张三</name>
            <age>20</age>
            <sex/>
        </student>
        <student>
            <name>李四</name>
            <sex/>
        </student>
    </studentlist>

    六、DTD中属性的定义

      语法:

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

       说明:

      ATTLIST:属性列表关键字。

      元素名称:要修饰的元素名称。

      属性名称:元素谁能够的名称。

      属性类型:CDATA、ID、IDREF/IDREFS、Enumerated。

      属性特点:#REQUIRED、#IMPLIED、#FIXED value、Default value。

      1)#REQUIRED:表示元素属性都必须有该属性的值,不能为空。

      2)#IMPLIED:表示元素属性可以忽略的值,可以为空。

      3)#FIXED value:表示元素属性必须为指定的固定值,固定值在value中指定。

      4)Default value:表示给指定元素默认值,不需要使用Default,直接指定默认值即可。

      属性类型:

      1、CDATA属性

      表示属性值可以是任何字符,包括数字和中文。

      示例:声明student属性name值为任何文本,必须有值

      DTD示例:

      <!ATTLIST student name CDATA #REQUIRED> 

      XML示例:

      <student name="zhangsan" />

      2、ID属性

      表示属性取值必须是唯一的

      示例1:对studentid属性设置为唯一值。并且必须有值。

      DTD示例:

      <!ATTLIST student id ID #REQUIRED> 

      XML示例:

      <student id="10086" />

      示例2:同时对多个属性设置属性,对student的id

      DTD示例:

      <!ELEMENT student (id,name)>

      <!ATTLIST student

        id ID #REQUIRED

        name CDATA #REQUIRED>

      XML示例:

      <student id="10086" name="zhangsan"></student>

      3、IDREF/IDREFS

      IDREF:表示该属性的值指向其他地方声明的ID类型的值。

      IDREFS:同IDREF,但是可以由空格分开多个引用。

      示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE categories [
        <!ELEMENT categories (category*)>
        <!ELEMENT category (category*)>
        <!ATTLIST category 
            id ID #REQUIRED 
            name CDATA #REQUIRED 
            parentid IDREF #IMPLIED>  <!--子类中的parentid引用外层的id-->
    ]>
    <categories>
        <category id="c_1" name="电器">
            <category id="c_10" parentid="c_1" name="电视"/>
            <category id="c_11" parentid="c_1" name="冰箱"/>
            <category id="c_12" parentid="c_1" name="冰箱"/>
        </category>
        <category id="c_2" name="手机">
            <category id="c_20" parentid="c_2" name="智能手机"/>
            <category id="c_21" parentid="c_2" name="非智能手机"/>
        </category>
    </categories>

      4、Enumerated

      枚举,预定义一些值,属性的值必须在所列出的值得范围类。

      DTD示例:学生性别只能是男或者女

      <!ATTLIST student sex (男|女) #REQUIRED>

      XML示例:

      <student sex="男">

    七、实体

      在DTD中定义的常量,在XML中使用。用于定义在XML中多次出现的值。

      实体可以分为内部实体和外部实体:

      1、内部实体

      语法:

      <!ENTITY 实体名 "实体值">

      示例:定义

      DTD示例:  

      <!ENTITY writer "Bill Gates">
      <!ENTITY copyright "Copyright W3School.com.cn">

      XML示例:

      <author>&writer;&copyright;</author>

      注意:一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

      2、外部实体

      语法:

      <!ENTITY 实体名称 SYSTEM "URI/URL">  

      DTD 例子:
      <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
      <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
      XML 例子:
      <author>&writer;&copyright;</author>

  • 相关阅读:
    smarty-2014-02-28
    PHP Functions
    Zabbix自定义监控网站服务是否能够正常响应
    Zabbix自定义监控网站服务是否能够正常响应
    shell技巧
    shell技巧
    ansible安装配置zabbix客户端
    ansible安装配置zabbix客户端
    shell命令getopts
    shell命令getopts
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4278899.html
Copyright © 2011-2022 走看看