搜尋
首頁後端開發XML/RSS教程XML中的DTD文件類型定義完全解析的範例程式碼(圖)

XML標籤的自訂功能非常強大,例如本文將要講解的DTD(Document Type Definition)就帶給人們一種物件導向般的感覺,well,下面就來看XML中的DTD檔案型別定義完全解析

#一、何為DTD
DTD的全稱為Document Type Definition,是一種檔案定義格式,它規定了XML檔案結構為XML檔案提供了語法與規則。在DTD中定義XML檔案的結構,然後依照DTD的聲明來編寫XML檔。它就好像程式語言中的函數定義,在使用函數時要根據函數宣告的格式來引用。
XML中的DTD文件類型定義完全解析的範例程式碼(圖)

二、DTD詳解
1、實例詳解

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!-- 声明内部DTD -->     
<!DOCTYPE 影片目录[     
       <!ELEMENT 影片目录 (影片)+>   <!-- 声明XML顶层元素的子元素“影片”,“+”表示有一个或多个影片子元素 -->     
       <!ELEMENT 影片 (片名,主演,导演,简介)>     <!-- 声明“影片”元素的子元素 -->     
       <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED> <!-- 声明“影片”元素的属性,两属性分别为“类别”和“年份”,CDATA说明属性的类型为字符型 -->     
       <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">   <!-- 实体的声明,类型为字符型,在下面使用“&实体名称;”直接引用 -->     
       <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
       <!ELEMENT 片名 (#PCDATA)>     
       <!ELEMENT 主演 (#PCDATA)>     
       <!ELEMENT 导演 (#PCDATA)>     
       <!ELEMENT 简介 (#PCDATA)>     
]>     
<!-- 由DTD获得的XML -->     
<影片目录>     
   <影片 类别="武侠" 年份="2008">     
         <片名>十面埋伏</片名>     
         <主演>刘德华、金城武、章子怡</主演>     
         <导演>张艺谋</导演>     
         <简介>&十面埋伏;</简介>     
   </影片>     
   <影片 类别="武侠" 年份="2006">     
       <片名>霍元甲</片名>     
       <主演>李连杰</主演>     
       <导演>于仁泰</导演>     
       <简介>&霍元甲;</简介>     
   </影片>     
</影片目录>

1.1 DTD宣告開始語句

#(1)內部聲明:具體的DTD語句]>
(2)外部聲明:SYSTEM/PUBLIC) "dtd文件名稱/dtd檔案的網路位址">
對於外部聲明有多種形式,主要分為SYSTEM和PUBLIC類型的檔案。
SYSTEM:一個作者或組織編寫的眾多XML文件中通用的DTD;
PUBLIC:由權威機構制定,提供給特定行業或公眾使用的DTD。
1.2 其它宣告
(1)元素:

<!ELEMENT element_name element_definition>

(2)屬性清單:

<!ATTLIST Element_Name   
   Attribute_Name Type [added_declare]   
   Attribute_Name Type [added_declare]   
   ......   
>

(3)實體
內部
一般:
參數:
外部
「一般:
一般:

一般:


2、內容詳解
2.1 元素聲明XML中的DTD文件類型定義完全解析的範例程式碼(圖)

##在元素聲明中需要注意的主要是幾種特殊的元素宣告和子元素出現的次數、選擇性、混合型,它們的作用類似於程式語言中的算數和邏輯運算子。如下,為具有多種元素的DTD實例。

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!DOCTYPE 影片目录 [     
    <!ELEMENT 影片目录 (影片,其它,说明)+>   <!-- 使用“+”号表明影片目录中的子元素出现至少一次 -->     
    <!ELEMENT 其它 EMPTY>   <!-- 使用EMPTY关键字声明空元素 -->     
    <!ELEMENT 说明 ANY>     <!-- 使用ANY关键字声明任何内容的元素 -->     
    <!ELEMENT 影片(片名,主演,导演,简介)>    <!-- 含有子元素的元素声明格式 -->      
    <!ATTLIST 影片      
                    名称 ID #FIXED "十面埋伏"     
                    类别 CDATA "动作"      
                    年份 CDATA #REQUIRED     
                    票房 CDATA #IMPLIED     
     
    >    <!-- 属性声明 -->     
    <!ENTITY introduction "漫天大雪,三人在雪中决斗">     
    <!ELEMENT 片名(#PCDATA)>     
    <!ELEMENT 主演(#PCDATA)>     
    <!ELEMENT 导演(#PCDATA)>     
    <!ELEMENT 简介(#PCDATA)>     
]>

想要深入了解元素宣告的基本語法,請下載該導圖。
2.2 命名衝突

在一個複雜的XML文件中有的時候會出現同名的元素,為了避免這種現象引入了命名空間和前綴標識。
2.2.1 命名空間
使用xmlns來引入命名空間,告訴使用者哪一部分是屬於該空間內的。在作用上它和其它程式語言中的命名空間有點類似,確保了元素的唯一性,避免發生衝突。

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影片 xmlns:h=&#39;http://www.abc.edu&#39; xmlns:c=&#39;http://www.123.edu&#39;><!-- 使用xmlns:来引用命名空间 -->     
  <db>     
    <h:table>werer</h:table>    <!-- 告诉用户,此table是在http://www.abc.edu中定义的 -->     
    <c:table>fdfdsfsdf</c:table>    <!-- 告诉用户,此table是在http://www.123.edu中定义的 -->     
  </db>     
</影片>

作用:標準化元素和屬性,並為它們加上唯一標誌;確保元素名稱中沒有衝突,並闡明了它們的來源。
2.2.2 前綴標識
在元素名稱和屬性名前增加一個標識,以唯一區分當前元素或屬性來自哪一個DTD,它常常和命名空間聯合使用,如上例中的

三、實體詳解

有了元素為什麼還要引進實體呢?要區分兩者,首先要看實體引進的目的。實體機制是一種節省大量時間的工具,將多種不同類型的資料併入XML文件的方法。它就好像是物件導向的抽象類別一樣,把經常使用的抽象成一個實體,在使用它的地方可以直接引用,避免了重複。
詳細的說
(1)代替無法輸入的字符,鍵盤只有26個字母和一些簡單的標點符號,而字符集中有成N多各種符號是無法在鍵盤中輸入的。
(2)取代一些與xml規格保留字相衝突的內容,如: 等等。
(3)取代大段落的重複的文字。
實體引用依照引用的位置分為內部和外部兩種,依引用的內容分為一般和參數引用兩種。下面看一個外部實體引用的實例:

清單1:「2.dtd」的宣告

<!-- 声明外部DTD,并保存为2.dtd -->     
      
<!ELEMENT 影片目录 (影片)+>     
<!ELEMENT 影片 (片名,主演,导演,简介)>     
<!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED>     
<!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">     
<!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
<!ELEMENT 片名 (#PCDATA)>     
<!ELEMENT 主演 (#PCDATA)>     
<!ELEMENT 导演 (#PCDATA)>     
<!ELEMENT 简介 (#PCDATA)>     
<!ENTITY filmcomment SYSTEM "影评.xml">       <!-- 引用外部通用实体,文件名称为“影评.xml” -->

清單2:影評.xml的內容

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影评>     
 这些影评都是由XXX公司出品,值得观看!     
</影评>

清單3:使用dtd的xml檔案中的內容。

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<影评>     
 这些影评都是由XXX公司出品,值得观看!     
</影评>


清單3:使用dtd的xml檔案中的內容。  

<?xml version="1.0" encoding=&#39;utf-8&#39;?>     
<!DOCTYPE 影片目录 SYSTEM "./2.dtd" >     
<影片目录>     
    <影片 类别="武侠" 年份="2008">     
        <片名>十面埋伏</片名>     
        <主演>刘德华、金城武、章子怡</主演>     
        <导演>张艺谋</导演>     
        <简介>&十面埋伏;</简介>     
    </影片>     
    <影片 类别="武侠" 年份="2006">     
        <片名>霍元甲</片名>     
        <主演>李连杰</主演>     
        <导演>于仁泰</导演>     
        <简介>&霍元甲;</简介>     
    </影片>     
     &filmcomment;     
</影片目录>

     
#清單4:使用IE8開啟清單3後的內容

#
<?xml version="1.0" encoding="utf-8" ?>     
  <!DOCTYPE 影片目录 (View Source for full doctype...)>     
- <影片目录>     
-   <影片 类别="武侠" 年份="2008">     
       <片名>十面埋伏</片名>     
       <主演>刘德华、金城武、章子怡</主演>     
       <导演>张艺谋</导演>     
       <简介>漫天大雪,三人在雪中决斗</简介>     
    </影片>     
-   <影片 类别="武侠" 年份="2006">     
       <片名>霍元甲</片名>     
       <主演>李连杰</主演>     
       <导演>于仁泰</导演>     
       <简介>民族英雄,与西方帝国主义抗争</简介>     
    </影片>     
    <影评>这些影评都是由XXX公司出品,值得观看!</影评>     
  </影片目录>

内部和外部很容易理解,主要看一般和参数两种引用的区别。

1.参数实体

清单1:test.dtd,在此该内容单独存在了一个dtd文件中是因为在内部DTD子集中。
参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。然而,对于外部DTD子集,则没有这个限制。

<!-- 声明外部DTD,并保存为test.dtd -->     
<!-- 个人信息实体声明的是参数类型的,可以再各个元素中共同使用该参数 -->     
<!ENTITY % 个人信息 "(姓名,性别,出生日期)">     
<!ELEMENT 学生信息 %个人信息;>     
<!ELEMENT 教师信息 %个人信息;>     
<!ELEMENT 员工信息 %个人信息;>


清单2:学校信息.xml文件,引用了外部的test.dtd文件

<?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?>     
<!-- 学校信息.xml文件 -->      
<!-- 引用外部DTD -->     
<!DOCTYPE 学校信息 SYSTEM &#39;./test.dtd&#39;>     
<!-- 由DTD获得的XML -->     
<学校信息>     
 <学生信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </学生信息>     
 <教师信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </教师信息>     
 <员工信息>     
  <姓名>张三</姓名>     
  <性别>男</性别>     
  <出生日期>2013-10-12</出生日期>     
 </员工信息>     
</学校信息>

       
清单3:使用IE8打开清单2的内容后

<?xml version="1.0" encoding="utf-8" ?>     
- <!--   
 声明内部DTD    
  -->     
  <!DOCTYPE 学校信息 (View Source for full doctype...)>     
- <!--   
 由DTD获得的XML    
  -->     
- <学校信息>     
-    <学生信息>     
       <姓名>张三</姓名>     
       <性别>男</性别>     
       <出生日期>2013-10-12</出生日期>     
     </学生信息>     
-    <教师信息>     
        <姓名>张三</姓名>     
        <性别>男</性别>     
        <出生日期>2013-10-12</出生日期>     
     </教师信息>     
-    <员工信息>     
        <姓名>张三</姓名>     
        <性别>男</性别>     
        <出生日期>2013-10-12</出生日期>     
     </员工信息>     
  </学校信息>

 
2. 一般实体

可在XML元素中加以引用,也可以在DTD中引用,但参数实体只能在DTD中引用,并且通常情况下只能在外部DTD文档中引用。

3. 对比升华

参数实体与一般实体的区别如下:

     (l)在定义参数实体时,实体名前必须加一个“%”号。

     (2)参数实体引用以“%”开始,而不是一般实体引用的“&”。

     (3)参数实体的内容不仅可以包含文本,还可以包含标记。

     (4)参数实体只能应用于DTD,而不能在文档本体中引用。即参数实体只能用来构成DTD的内容,而不能构成文档内容。

     (5)参数实体只能在外部DTD文档中使用,无法应用于内部DTD。


外部参数实体与外部一般实体的区别如下:

     (1)外部参数实体应用于独立的DTD文档,外部一般实体应用于XML文档。

     (2)外部参数实体应用于将多个独立的DTD文档组合为一个大的DTD文档,外部一般实体用于将多个独立的XML文档组合成一个大的XML文档。


四、验证XML文件的合法性

DTD定义了XML文件的使用格式,它从结构和形式上限制了XML文档,通过引用DTD可以形成统一的规范化的XML文档,另外通过使用实体简化了DTD和XML文档的内容。使用DTD验证的XML文档才能称为规范化文档,那如何验证所写的XML文档是否符合DTD的规范呢。通过如下的代码串:

import javax.xml.parsers.DocumentBuilder;     
import javax.xml.parsers.DocumentBuilderFactory;     
     
import org.xml.sax.InputSource;     
     
public class ValidateDTD     
{     
    public static void main(String[] args){     
             
        //在验证前需要把需要验证的XML和规范DTD包含在jar中     
        try{     
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();    //创建一个文档构造工厂     
            dbf.setValidating(true);     
            DocumentBuilder builder=dbf.newDocumentBuilder();     
            builder.parse(new InputSource("xml-2-2.xml"));  //需要验证的XML名称     
        }catch(Exception e){     
            e.printStackTrace();     
        }     
    }     
}

上面代码中的类和结构主要完成了XML文档的解析,并且在解析之前验证当前XML文件是否符合某个DTD的定义。在上面的代码运行前需要将需要验证的XML和提供规范化的DTD文档引入到当前ValidateDTD项目中,后运行上面的代码实例,该项目会在项目文件中自动查找规范的DTD,然后验证xml文件。

五、结语
至此,有关文件定义格式的内容已经基本上讨论了一遍,从最初的元素声明到复杂多变的实体类型,DTD的引入无疑为XML的使用指定了一个统一的标准,这种标准是由提供方规定好,使用方遵守的一种规则,并在最后讨论了如何验证引用DTD的XML合法与否。另外描述XML文档结构的不仅仅只有DTD,DTD是一种早期的定义格式,它有很多缺点,如不支持数据类型,不易于扩展等,为了避免这种缺点后来又引入了Schema,它是DTD的继任者,下篇博客将着重讨论Schema。

以上是XML中的DTD文件類型定義完全解析的範例程式碼(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
理解RSS:XML觀點理解RSS:XML觀點Apr 25, 2025 am 12:14 AM

RSS是一種基於XML的格式,用於發布經常更新的內容。 1.RSSfeed通過XML結構化組織信息,包括標題、鏈接、描述等。 2.創建RSSfeed需按照XML結構編寫,添加元數據如語言和發布日期。 3.高級用法可包含多媒體文件和分類信息。 4.調試時使用XML驗證工具,確保必需元素存在且編碼正確。 5.優化RSSfeed可通過分頁、緩存和保持結構簡潔來實現。通過理解和應用這些知識,可以有效管理和分發內容。

XML中的RSS:解碼標籤,屬性和結構XML中的RSS:解碼標籤,屬性和結構Apr 24, 2025 am 12:09 AM

RSS是一種基於XML的格式,用於發布和訂閱內容。 RSS文件的XML結構包括根元素、元素和多個元素,每個代表一個內容條目。通過XML解析器讀取和解析RSS文件,用戶可以訂閱並獲取最新內容。

XML在RSS中的優勢:技術深度潛水XML在RSS中的優勢:技術深度潛水Apr 23, 2025 am 12:02 AM

XML在RSS中具有結構化數據、可擴展性、跨平台兼容性和解析驗證的優勢。 1)結構化數據確保內容的一致性和可靠性;2)可擴展性允許添加自定義標籤以適應內容需求;3)跨平台兼容性使其在不同設備上無縫工作;4)解析和驗證工具確保Feed的質量和完整性。

XML中的RSS:揭示內容聯合的核心XML中的RSS:揭示內容聯合的核心Apr 22, 2025 am 12:08 AM

RSS在XML中的實現方式是通過結構化的XML格式來組織內容。 1)RSS使用XML作為數據交換格式,包含頻道信息和項目列表等元素。 2)生成RSS文件需按規範組織內容,發佈到服務器供訂閱。 3)RSS文件可通過閱讀器或插件訂閱,實現內容自動更新。

超越基礎:高級RSS文檔功能超越基礎:高級RSS文檔功能Apr 21, 2025 am 12:03 AM

RSS的高級功能包括內容命名空間、擴展模塊和條件訂閱。 1)內容命名空間擴展RSS功能,2)擴展模塊如DublinCore或iTunes添加元數據,3)條件訂閱根據特定條件篩選條目。這些功能通過添加XML元素和屬性實現,提升信息獲取效率。

XML主鏈:RSS提要如何結構XML主鏈:RSS提要如何結構Apr 20, 2025 am 12:02 AM

RSSFEEDSUSEXMLTOSSTRUCTURECONTUPDATE.1)XMLPROVIDEDIDESAHIERARCHICALSTRUCTUREFFORDATA.2)THEELEMENTDEFINESTHEEFEED'SIDENTITYANDCONTAINS ELEMENT.3)ELEMENTEMERPREPRESERPRESENTERPRESENTIVIDIVIVELPIECTUALPIECES.4)RSSSSSSSSSSSISEXTEXTENSIBLERECTICERSINCREECTINCERINCTICENT.5)

RSS和XML:了解Web內容的動態二重奏RSS和XML:了解Web內容的動態二重奏Apr 19, 2025 am 12:03 AM

RSS和XML是用於網絡內容管理的工具。 RSS用於發布和訂閱內容,XML用於存儲和傳輸數據。它們的工作原理包括內容髮布、訂閱和更新推送。使用示例包括RSS發布博客文章和XML存儲書籍信息。

RSS文檔:Web聯合組織的基礎RSS文檔:Web聯合組織的基礎Apr 18, 2025 am 12:04 AM

RSS文檔是基於XML的結構化文件,用於發布和訂閱頻繁更新的內容。它的主要作用包括:1)自動化內容更新,2)內容聚合,3)提高瀏覽效率。通過RSSfeed,用戶可以訂閱並及時獲取來自不同來源的最新信息。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能