中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

XML文件約束DTD的示例分析

發布時間:2021-09-17 14:46:50 來源:億速云 閱讀:214 作者:小新 欄目:編程語言

小編給大家分享一下XML文件約束DTD的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1.XML文件約束與DTD的簡單介紹

我們編寫文檔來約束一個XML文檔的書寫規范,這稱之為XML約束。

常用的約束技術有:

  • XML DTD

  • XML Schema

DTD的基本概念:

document type definition 文檔類型定義

DTD文件一般和XML文件配合使用,主要是為了約束XML文件。

XML文件引入DTD文件,這樣XML可以自定義標簽,但又受到DTD文件的約束。比如上一節使用XML描述一個班級的信息,如果我們給每一個學生定義一個<面積>標簽,語法上也是沒有錯誤的,但是不符合語義,學生怎么能夠用面積來描述呢?這時候我們就需要用到DTD文件來約束這個XML。

<?xml version="1.0" encoding="gb2312"?><class>
    <stu id="001">
        <name>楊過</name> 
        <sex>男</sex>
        <age>20</age>
        <面積>100</面積>
    </stu></class>

1.1 DTD約束快速入門案例

基本語法:

<!ELEMENT 元素名 類型>

我們還以班級為例,編寫如下DTD文件,myClass.dtd:

<!ELEMENT 班級 (學生+)><!ELEMENT 學生 (名字,年齡,介紹)><!ELEMENT 名字 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 介紹 (#PCDATA)>

第一行表示根元素為班級,并且有學生這個子元素,子元素為1或者多個。
第二行表示學生的子元素為名字,年齡,介紹
名字下面沒有子元素了,那么#PCDATA表示名字里面可以放任意文本。
年齡和介紹也是類似。

編寫myClass.xml文件并引入DTD文件如下:

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,約束這個xml--><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生>
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>   
    <學生>
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

引入中寫的:SYSTEM,表示當前的DTD文件是本地的
如果寫的是PUBLIC,則表示引入的DTD文件是來自于網絡的.

這時候引入的DTD文件是沒有產生作用的,如果我們在學生元素中添加子元素<面積>,打開這個XML文件,瀏覽器依然不會報錯。

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,約束這個xml--><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生>
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
        <面積>100平米</面積>
    </學生>   
    <學生>
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

我們需要編程校驗XML文檔的正確性

IE5以上的瀏覽器內置了XML解析工具:Microsoft.XMLDOM,開發人員可以編寫JavaScript代碼,利用這個解析工具裝載XML文件,并對XML文件進行DTD驗證。

我們編寫myXmlTools.html來對這個XML進行校驗,如下:

<html>
    <head>
    <!--自己編寫一個簡單的解析工具,去解析XML DTD是否配套-->     
    <script language="javascript">
        // 創建xml文檔解析器對象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");        // 開啟xml校驗
        xmldoc.validateOnParse = "true";        // 裝載xml文檔,即指定校驗哪個XML文件
        xmldoc.load("myClass.xml");
        document.writeln("錯誤信息:"+xmldoc.parseError.reason+"<br>");
        document.writeln("錯誤行號:"+xmldoc.parseError.line);    </script>

    </head>
    <body>

    </body></html>

用IE瀏覽器打開這個html文件,可以看到運行結果:

XML文件約束DTD的示例分析

可以看到第9行正是我們添加的<面積>這一行。

2.DTD細節

2.1 DTD文檔的聲明及引用

1.內部DTD文檔

<!DOCTYPE 根元素 [定義內容]>

2.外部DTD文檔

引入外部的DTD文檔分為兩種:

(1)當引用的DTD文件是本地文件的時候,用SYSTEM標識,并寫上”DTD的文件路徑”,如下:

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

(2)如果引用的DTD文件是一個公共的文件時,采用PUBLIC標識,如下方式:

<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的URL">

比如下例:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2.2 DTD基本語法:

<!ELEMENT NAME CONTENT>

其中:
- ELEMENT是關鍵字,是不能修改的
- NAME表示元素名稱
- CONTENT是元素類型,必須要大寫!CONTENT的內容有三種寫法:

(1)EMPTY——表示該元素不能包含子元素和文本,但可以有屬性。
 (2)ANY——表示該元素可以包含任何在該DTD中定義的元素內容
 (3)#PCDATA——可以包含任何字符數據,但是不能在其中包含任何子元素

2.3 DTD元素的組合類型:

DTD中這樣規定:

<!ELEMENT 家庭(人+,家電*)>

這個DTD規定了家庭元素中可以有1到多個”人”這個子元素,也可以有0到多個”家電”這個子元素。其中的加號”+”和星號”*”的含義與正則表達式中的含義一致。

XML這樣寫:

<家庭>
    <人 名字="張曉明" 性別="男" 年齡="25"/>
    <人 名字="李小鋼" 性別="男" 年齡="36" 愛好="作個教育家和偉人"/>
    <家電 名稱="彩電" 數量="3"/></家庭>

關于組合類型,有下述的的修飾符可以使用:

符號用途示例示例說明
()用來給元素分組(古龍|金庸),(王朔|余杰)分成兩組
|在列出的對象中選擇一個(男人|女人)表示男人或者女人必須出現,兩者至少選其一
+該對象必須出現一次或者多次(成員+)表示成員必須出現,而卻可以出現多個成員
*該對象允許出現0次或者多次(愛好*)愛好可以出現兩次到多次
?該對象必須出現0次或者1次(菜鳥?)菜鳥可以出現,也可以不出現,如果出現的話,最多只能出現一次
,對象必須按指定的順序出現(西瓜,蘋果,香蕉)表示西瓜、蘋果、香蕉必須出現,并且按這個順序出現

2.4 屬性定義

DTD中屬性的定義是這樣的:

<!ATTLIST 元素名稱
    屬性名稱 類型 屬性特點
    屬性名稱 類型 屬性特點......  >

其中,屬性的類型有下面5種:

(1) CDATA
 (2) ID
 (3) IDREF/IDREFS
 (4) Enumerated
 (5) ENTITY/ENTITIES

屬性的特點有如下4種:

(1) #REQUIRED,表示這個屬性必須給,不給就報錯
 (2) #IMPLIED,表示這個屬性可以給也可以不給
 (3) #FIXED value,表示這個屬性必須給一個固定的value值
 (4) Default value,表示這個屬性如果沒有值,就分配一個默認的value值

比如,我們想在學生這個子元素上加上地址這個屬性,而且這個屬性是必須的,示例如下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生 地址="香港">
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>   
    <學生 地址="澳門">
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

這個時候相應的DTD文件也要更新,不然就會報錯,如下:

<!ELEMENT 班級 (學生+)><!ELEMENT 學生 (名字,年齡,介紹)><!ATTLIST 學生
    地址 CDATA #REQUIRED><!ELEMENT 名字 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 介紹 (#PCDATA)>

2.4.1 對于屬性類型的詳細解釋

(1)屬性類型-CDATA,表示屬性值可以是任何字符(包括中文和數字)

<!ATTLIST 木偶
    姓名 CDATA #REQUIRED>
<木偶 姓名="匹諾曹"/><木偶 姓名="PiNuocao"/><木偶 姓名="123"/>

(2)屬性類型-ID,表明該屬性的取值必須是唯一的,但是屬性的值不能是以數字開頭!

<!ELEMENT 公司職員 ANY><!ATTLIST 公司職員
    編號 ID #REQUIRED
    姓名 CDATA #REQUIRED>
<公司職員 編號="Z001" 姓名="張三"/><公司職員 編號="Z002" 姓名="李思"/>

(3)屬性類型-IDREF/IDREFS
- IDREF屬性的值指向文檔中其它地方聲明的ID類型的值
- IDREFS同IDREF,但是可以具有由空格分開的多個引用。

<!ELEMENT 家庭(人+)><!ELEMENT 人 EMPTY><!ATTLIST 人    relID ID #REQUIRED
    paraentID IDREFS #IMPLIED
    name CDATA #REQUIRED>
<家庭>
    <人 relID="P_1" name="爸爸"/>
    <人 relID="P_2" name="媽媽"/>
    <人 relID="P_3" parentID="P_1 P_2" name="兒子"/></家庭>

(4)屬性類型-Enumerated,事先定義好一些值,屬性的值必須在所列出的值的范圍內。

<!ATTLIST person
    婚姻狀態 (single|married|porced|widowed) #IMPLIED><!ATTLIST person
    性別 (男|女) #REQUIRED>

(5)屬性類型-ENTITY,實體

實體定義:
- 實體用于為一段內容創建一個別名,以后在XML文檔中就可以使用別名引用這段內容了。
- 在DTD定義中,一條!ENTITY語句用于定義一個實體。
- 實體可分為兩種類型:引用實體和參數實體。引用實體是被XML文檔應用的,而參數實體是被DTD文件本身應用的。

①引用實體:

  • 引用實體主要在XML文檔中被應用
     語法格式如下,引用實體的定義內容最好放在DTD文件的最后。

<!ENTITY 實體名稱 "實體內容">

引用方式:&實體名稱;   末尾要帶上分號,這個引用將直接轉變成實體內容

舉例如下:

<!ENTITY copyright "I am a programmer">....
&copyright;

②參數實體:

參數實體被DTD文件自身使用
 語法格式為:

<!ENTITY % 實體名稱 "實體內容">

引用方式為:%實體名稱

舉例:

<!ENTITY % TAG_NAME "姓名|EMAIL|電話|地址"><!ELEMENT 個人信息 (%TAG_NAME;|生日)><!ELEMENT 客戶信息 (%TAG_NAME;|公司名)>

3.DTD實際案例

學習DTD的目標在于:
(1)要求我們能夠看得懂DTD文件,
(2)我們可以根據給出的DTD寫出對應的XML文件

下面我們看一個案例,下述的DTD文件是從W3School在線教程中的DTD案例中拿過來的,細看每一行,我們都應該能夠看得懂。

<!ENTITY AUTHOR "John Doe"><!ENTITY COMPANY "JD Power Tools, Inc."><!ENTITY EMAIL "jd@jd-tools.com"><!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)><!ATTLIST PRODUCTNAME CDATA #IMPLIEDCATEGORY (HandTool|Table|Shop-Professional) 
"HandTool"PARTNUM CDATA #IMPLIEDPLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)><!ATTLIST SPECIFICATIONSWEIGHT CDATA #IMPLIEDPOWER CDATA #IMPLIED><!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONSFINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"CASE (HardShell|Soft|NotApplicable) "HardShell"><!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICEMSRP CDATA #IMPLIEDWHOLESALE CDATA #IMPLIEDSTREET CDATA #IMPLIEDSHIPPING CDATA #IMPLIED><!ELEMENT NOTES (#PCDATA)>

然后我們可以根據該DTD編寫如下最簡單的XML文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE CATALOG SYSTEM "product.dtd"><CATALOG>
    <PRODUCT NAME="康帥傅礦泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago">
        <SPECIFICATIONS WEIGHT="20" POWER="18">這里是細節</SPECIFICATIONS>
        <PRICE>25</PRICE>
        <PRICE>28</PRICE>
    </PRODUCT></CATALOG>

然后我們用Microsoft.XMLDOM校驗該XML,會發現沒有任何錯誤。但是要注意編碼。

1.XML文件約束與DTD的簡單介紹

我們編寫文檔來約束一個XML文檔的書寫規范,這稱之為XML約束。

常用的約束技術有:

  • XML DTD

  • XML Schema

DTD的基本概念:

document type definition 文檔類型定義

DTD文件一般和XML文件配合使用,主要是為了約束XML文件。

XML文件引入DTD文件,這樣XML可以自定義標簽,但又受到DTD文件的約束。比如上一節使用XML描述一個班級的信息,如果我們給每一個學生定義一個<面積>標簽,語法上也是沒有錯誤的,但是不符合語義,學生怎么能夠用面積來描述呢?這時候我們就需要用到DTD文件來約束這個XML。

<?xml version="1.0" encoding="gb2312"?><class>
    <stu id="001">
        <name>楊過</name> 
        <sex>男</sex>
        <age>20</age>
        <面積>100</面積>
    </stu></class>

1.1 DTD約束快速入門案例

基本語法:

<!ELEMENT 元素名 類型>

我們還以班級為例,編寫如下DTD文件,myClass.dtd:

<!ELEMENT 班級 (學生+)><!ELEMENT 學生 (名字,年齡,介紹)><!ELEMENT 名字 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 介紹 (#PCDATA)>

第一行表示根元素為班級,并且有學生這個子元素,子元素為1或者多個。
第二行表示學生的子元素為名字,年齡,介紹
名字下面沒有子元素了,那么#PCDATA表示名字里面可以放任意文本。
年齡和介紹也是類似。

編寫myClass.xml文件并引入DTD文件如下:

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,約束這個xml--><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生>
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>   
    <學生>
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

引入中寫的:SYSTEM,表示當前的DTD文件是本地的
如果寫的是PUBLIC,則表示引入的DTD文件是來自于網絡的.

這時候引入的DTD文件是沒有產生作用的,如果我們在學生元素中添加子元素<面積>,打開這個XML文件,瀏覽器依然不會報錯。

<?xml version="1.0" encoding="utf-8"?><!--引入dtd文件,約束這個xml--><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生>
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
        <面積>100平米</面積>
    </學生>   
    <學生>
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

我們需要編程校驗XML文檔的正確性

IE5以上的瀏覽器內置了XML解析工具:Microsoft.XMLDOM,開發人員可以編寫JavaScript代碼,利用這個解析工具裝載XML文件,并對XML文件進行DTD驗證。

我們編寫myXmlTools.html來對這個XML進行校驗,如下:

<html>
    <head>
    <!--自己編寫一個簡單的解析工具,去解析XML DTD是否配套-->     
    <script language="javascript">
        // 創建xml文檔解析器對象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");        // 開啟xml校驗
        xmldoc.validateOnParse = "true";        // 裝載xml文檔,即指定校驗哪個XML文件
        xmldoc.load("myClass.xml");
        document.writeln("錯誤信息:"+xmldoc.parseError.reason+"<br>");
        document.writeln("錯誤行號:"+xmldoc.parseError.line);    </script>

    </head>
    <body>

    </body></html>

用IE瀏覽器打開這個html文件,可以看到運行結果:

XML文件約束DTD的示例分析

可以看到第9行正是我們添加的<面積>這一行。

2.DTD細節

2.1 DTD文檔的聲明及引用

1.內部DTD文檔

<!DOCTYPE 根元素 [定義內容]>

2.外部DTD文檔

引入外部的DTD文檔分為兩種:

(1)當引用的DTD文件是本地文件的時候,用SYSTEM標識,并寫上”DTD的文件路徑”,如下:

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

(2)如果引用的DTD文件是一個公共的文件時,采用PUBLIC標識,如下方式:

<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的URL">

比如下例:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2.2 DTD基本語法:

<!ELEMENT NAME CONTENT>

其中:
- ELEMENT是關鍵字,是不能修改的
- NAME表示元素名稱
- CONTENT是元素類型,必須要大寫!CONTENT的內容有三種寫法:

(1)EMPTY——表示該元素不能包含子元素和文本,但可以有屬性。
 (2)ANY——表示該元素可以包含任何在該DTD中定義的元素內容
 (3)#PCDATA——可以包含任何字符數據,但是不能在其中包含任何子元素

2.3 DTD元素的組合類型:

DTD中這樣規定:

<!ELEMENT 家庭(人+,家電*)>

這個DTD規定了家庭元素中可以有1到多個”人”這個子元素,也可以有0到多個”家電”這個子元素。其中的加號”+”和星號”*”的含義與正則表達式中的含義一致。

XML這樣寫:

<家庭>
    <人 名字="張曉明" 性別="男" 年齡="25"/>
    <人 名字="李小鋼" 性別="男" 年齡="36" 愛好="作個教育家和偉人"/>
    <家電 名稱="彩電" 數量="3"/></家庭>

關于組合類型,有下述的的修飾符可以使用:

符號用途示例示例說明
()用來給元素分組(古龍|金庸),(王朔|余杰)分成兩組
|在列出的對象中選擇一個(男人|女人)表示男人或者女人必須出現,兩者至少選其一
+該對象必須出現一次或者多次(成員+)表示成員必須出現,而卻可以出現多個成員
*該對象允許出現0次或者多次(愛好*)愛好可以出現兩次到多次
?該對象必須出現0次或者1次(菜鳥?)菜鳥可以出現,也可以不出現,如果出現的話,最多只能出現一次
,對象必須按指定的順序出現(西瓜,蘋果,香蕉)表示西瓜、蘋果、香蕉必須出現,并且按這個順序出現

2.4 屬性定義

DTD中屬性的定義是這樣的:

<!ATTLIST 元素名稱
    屬性名稱 類型 屬性特點
    屬性名稱 類型 屬性特點......  >

其中,屬性的類型有下面5種:

(1) CDATA
 (2) ID
 (3) IDREF/IDREFS
 (4) Enumerated
 (5) ENTITY/ENTITIES

屬性的特點有如下4種:

(1) #REQUIRED,表示這個屬性必須給,不給就報錯
 (2) #IMPLIED,表示這個屬性可以給也可以不給
 (3) #FIXED value,表示這個屬性必須給一個固定的value值
 (4) Default value,表示這個屬性如果沒有值,就分配一個默認的value值

比如,我們想在學生這個子元素上加上地址這個屬性,而且這個屬性是必須的,示例如下:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE 班級 SYSTEM "myClass.dtd"><班級>
    <學生 地址="香港">
        <名字>周小星</名字>    
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>   
    <學生 地址="澳門">
        <名字>林曉</名字> 
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生>   </班級>

這個時候相應的DTD文件也要更新,不然就會報錯,如下:

<!ELEMENT 班級 (學生+)><!ELEMENT 學生 (名字,年齡,介紹)><!ATTLIST 學生
    地址 CDATA #REQUIRED><!ELEMENT 名字 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 介紹 (#PCDATA)>

2.4.1 對于屬性類型的詳細解釋

(1)屬性類型-CDATA,表示屬性值可以是任何字符(包括中文和數字)

<!ATTLIST 木偶
    姓名 CDATA #REQUIRED>
<木偶 姓名="匹諾曹"/><木偶 姓名="PiNuocao"/><木偶 姓名="123"/>

(2)屬性類型-ID,表明該屬性的取值必須是唯一的,但是屬性的值不能是以數字開頭!

<!ELEMENT 公司職員 ANY><!ATTLIST 公司職員
    編號 ID #REQUIRED
    姓名 CDATA #REQUIRED>
<公司職員 編號="Z001" 姓名="張三"/><公司職員 編號="Z002" 姓名="李思"/>

(3)屬性類型-IDREF/IDREFS
- IDREF屬性的值指向文檔中其它地方聲明的ID類型的值
- IDREFS同IDREF,但是可以具有由空格分開的多個引用。

<!ELEMENT 家庭(人+)><!ELEMENT 人 EMPTY><!ATTLIST 人    relID ID #REQUIRED
    paraentID IDREFS #IMPLIED
    name CDATA #REQUIRED>
<家庭>
    <人 relID="P_1" name="爸爸"/>
    <人 relID="P_2" name="媽媽"/>
    <人 relID="P_3" parentID="P_1 P_2" name="兒子"/></家庭>

(4)屬性類型-Enumerated,事先定義好一些值,屬性的值必須在所列出的值的范圍內。

<!ATTLIST person
    婚姻狀態 (single|married|porced|widowed) #IMPLIED><!ATTLIST person
    性別 (男|女) #REQUIRED>

(5)屬性類型-ENTITY,實體

實體定義:
- 實體用于為一段內容創建一個別名,以后在XML文檔中就可以使用別名引用這段內容了。
- 在DTD定義中,一條!ENTITY語句用于定義一個實體。
- 實體可分為兩種類型:引用實體和參數實體。引用實體是被XML文檔應用的,而參數實體是被DTD文件本身應用的。

①引用實體:

  • 引用實體主要在XML文檔中被應用
     語法格式如下,引用實體的定義內容最好放在DTD文件的最后。

<!ENTITY 實體名稱 "實體內容">

引用方式:&實體名稱;   末尾要帶上分號,這個引用將直接轉變成實體內容

舉例如下:

<!ENTITY copyright "I am a programmer">....
&copyright;

②參數實體:

參數實體被DTD文件自身使用
 語法格式為:

<!ENTITY % 實體名稱 "實體內容">

引用方式為:%實體名稱

舉例:

<!ENTITY % TAG_NAME "姓名|EMAIL|電話|地址"><!ELEMENT 個人信息 (%TAG_NAME;|生日)><!ELEMENT 客戶信息 (%TAG_NAME;|公司名)>

3.DTD實際案例

學習DTD的目標在于:
(1)要求我們能夠看得懂DTD文件,
(2)我們可以根據給出的DTD寫出對應的XML文件

下面我們看一個案例,下述的DTD文件是從W3School在線教程中的DTD案例中拿過來的,細看每一行,我們都應該能夠看得懂。

<!ENTITY AUTHOR "John Doe"><!ENTITY COMPANY "JD Power Tools, Inc."><!ENTITY EMAIL "jd@jd-tools.com">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCTNAME CDATA #IMPLIEDCATEGORY (HandTool|Table|Shop-Professional) "HandTool"PARTNUM CDATA 
#IMPLIEDPLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONSWEIGHT CDATA #IMPLIEDPOWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONSFINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICEMSRP CDATA #IMPLIEDWHOLESALE CDATA #IMPLIEDSTREET CDATA #IMPLIEDSHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>

然后我們可以根據該DTD編寫如下最簡單的XML文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE CATALOG SYSTEM "product.dtd"><CATALOG>
    <PRODUCT NAME="康帥傅礦泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago">
        <SPECIFICATIONS WEIGHT="20" POWER="18">這里是細節</SPECIFICATIONS>
        <PRICE>25</PRICE>
        <PRICE>28</PRICE>
    </PRODUCT></CATALOG>

然后我們用Microsoft.XMLDOM校驗該XML,會發現沒有任何錯誤。但是要注意編碼。

以上是“XML文件約束DTD的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会泽县| 青海省| 太和县| 神木县| 古蔺县| 潮安县| 泰宁县| 鄂托克旗| 安阳县| 桐乡市| 临漳县| 东丽区| 靖安县| 墨脱县| 鄂托克旗| 宜都市| 威远县| 永和县| 肇州县| 菏泽市| 临湘市| 蕉岭县| 四川省| 清镇市| 东方市| 海晏县| 高雄县| 西城区| 繁峙县| 房产| 镇原县| 大竹县| 临夏县| 沈丘县| 大同县| 永清县| 平果县| 阿鲁科尔沁旗| 敦煌市| 婺源县| 永德县|