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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM