單元 2-1 : xml 文件類型定義

33
單單 2-1 XML 單單單單單單 單單單 單單單單單單單

Upload: charlton-alberto

Post on 31-Dec-2015

71 views

Category:

Documents


0 download

DESCRIPTION

單元 2-1 : XML 文件類型定義. 王豐緒 銘傳大學資工系. 單元目標. 能夠 理解 DTD 的相關語法與意義 能夠 運用 DTD 撰寫一份文件格式定義 能夠結合 DTD 與 XML parser , 檢驗 XML 文件的合適性. 何謂 DTD ?. 文件格式定義 ( Document Type Definition )定義 XML 文件的「 格式 」( Format), 亦即 XML 文件需要包含那些「 標記 」( tag)、「 屬性 」( attribute)、 實體 ( entities) 以及 標記之間的 結構 等等. XML 資料. 合格的 XML 文件. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 單元 2-1 : XML 文件類型定義

單元 2-1 :XML 文件類型定義

王豐緒銘傳大學資工系

Page 2: 單元 2-1 : XML 文件類型定義

單元目標

能夠理解 DTD 的相關語法與意義 能夠運用 DTD 撰寫一份文件格式定義 能夠結合 DTD 與 XML parser ,檢驗 XML

文件的合適性

Page 3: 單元 2-1 : XML 文件類型定義

何謂 DTD?

文件格式定義( Document Type Definition )定義 XML 文件的「格式」( Format ),亦即 XML 文件需要包含那些「標記」( tag )、「屬性」( attribute )、實體( entities )以及標記之間的結構等等

合格的XML 文件

DTD 文件規範

有效的XML 文件

DTD 文件

XML 資料

XML剖析器

Page 4: 單元 2-1 : XML 文件類型定義

使用 DTD 有什麼樣的好處

規範 XML 文件的格式› 方便 XML 文件的交換與應用程式的處理› 建立資料交換的標準

定義出具以下特性的文件格式規範› 「通用性」 (general)› 「完整性」 (complete)

可重複使用 XML 文件格式定義 宣告的方式

› 內部文件格式定義之宣告› 外部文件格式定義之宣告

Page 5: 單元 2-1 : XML 文件類型定義

內部 DTD 文件格式定義之宣告<!DOCTYPE 根元素名稱 [

......... ]> 「 <!DOCTYPE 」是宣告的開始。 「根元素名稱」放您 DTD 定義的根元素名稱。 「 [ 」及「 ] 」是 DTD 定義的開始與結束符號。 「 ....... 」為您要定義的 DTD 。 DOCTYPE 宣告須在 XML 宣告之後,任何元素

宣告之前 可以有幾個 DTD 宣告 ?

Page 6: 單元 2-1 : XML 文件類型定義

外部 DTD 文件格式定義之宣告

外部 DTD 宣告的語法主要區分成兩大類:› 「 SYSTEM 」 : 私有用途› 「 PUBLIC 」 : 公開用途

<!DOCTYPE 根元素名稱 SYSTEM|PUBLIC "DTD_URI" ["DTD_URL"]>

Page 7: 單元 2-1 : XML 文件類型定義

參數說明

<!DOCTYPE 根元素名稱 SYSTEM|PUBLIC [DTDName] "DTD_URL">

<!DOCTYPE :宣告的開始 根元素名稱: XML 文件的根元素名稱 ( 不一定是 DTD 的根元素 ) SYSTEM :表示此指令為「私用型」外部 DTD PUBLIC :表示為「公開型」外部 DTD DTDName :公開型 DTD 的名稱 DTD_URL :用 URL 的方式來指定 DTD 檔案所在的位置 例子:

<!DOCTYPE Resume SYSTEM “intro.dtd”> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "

http://www.w3.org/TR/html4/strict.dtd">

Page 8: 單元 2-1 : XML 文件類型定義

DTD 基本標示指令

ELEMENT› 定義 XML 元素

ATTLIST› 定義 XML 元素的屬性

Page 9: 單元 2-1 : XML 文件類型定義

元素的設定: ELEMENT <!ELEMENT Element_Name

(Element_Definition) > <!ELEMENT :指名定義 XML 元素 Element_Name : XML 元素的名稱 Element_DefinitionXML 元素的內容

子元素的順序 , 次數 , 資料型態等

<!ELEMENT A (B, C, D) ><!ELEMENT B (#PCDATA) ><!ELEMENT C (#PCDATA) ><!ELEMENT D (#PCDATA) >

<A> <B>bbbbb</B> <C>ccccc</C> <D>ddddd</D></A>

Page 10: 單元 2-1 : XML 文件類型定義

在 DTD 中定義 XML 元素之類型

分為五種 EMPTY 元素

沒有文字內容或子元素 , ( 但可以有屬性 ) <!ELEMENT Somedata EMPTY >

子元素 (sub-element) 如 <!ELEMENT DOG (Nickname, Breeder, Birthday, HowOld,

Breed)> 文字資料 (text)

如 <!ELEMENT Nickname (#PCDATA)> 混合 (mixed)

包含文字內容或子元素 <!ELEMENT element_name (#PCDATA | ..|...)*>

ANY 元素 任何其它被宣告過的元素以及任何文字資料。 對於此元素之標籤不限制其次數及次序。 <!ELEMENT SomeElm ANY >

#PCDATA 一定要出現在第一個

Page 11: 單元 2-1 : XML 文件類型定義

宣告標記可出現的次數

符號 允許出現次數› ? 零或一次› * 大於等於零次› + 大於等於一次› 沒有符號 一次

<!ELEMENT A (B?, C*, D+, E) >

<!ELEMENT A (B, (C, D)?, (E, F)*, (G, H)+, (I, J)) >

<!ELEMENT A (B)* >

Page 12: 單元 2-1 : XML 文件類型定義

選擇區隔符號 : |

我們希望子元素有選擇空間 ( 只能選其一 ) 時使用例:學歷有很多種可選擇

<!ELEMENT 教育程度 ( 高中 | 大學 | 碩士 | 博士 )>教育程度下只能有高中 , 大學 , 碩士或博士

Page 13: 單元 2-1 : XML 文件類型定義

混合型元素

相關選項 「 #PCDATA 」 ( 一定要放在第一位 ) 加上其它元素可以選擇例:可選擇的職業

<!ELEMENT 職業 (#PCDATA | 教育 | 學生 | 資訊相關 )*>職業下可以是文字或是任何教育 , 學生 , 資訊相關的組合

Page 14: 單元 2-1 : XML 文件類型定義

定義 XML 元素的屬性(ATTLIST)

<!ATTLIST element_name attr_name attr_type attr_dafaults >

attr_defaults #REQUIRED ( 此屬性為必要的 , 一定要給值 ) #IMPLIED ( 此屬性為可有可無的 , 可給可不給 ) #FIXED xxxx ( 此屬性值是 xxxx, 不能改變 ) xxxx ( 此屬性可給可不給 , 預設值是 xxxx, 但可以改

變 ) attr_type

文字型態 (CDATA) Tokenized 列舉式型態 (enumerated) 例句: <!ATTLIST 飼主 生日 CDATA #IMPLIED>

Page 15: 單元 2-1 : XML 文件類型定義

DTD 提供的屬性型態 CDATA

屬性值的文字資料 ( 注意 :#PCDATA 只適用在指定元素的文字內容 )

TOKEN 型態 ID, IDREF, IDREFS( 以空白字元隔開 ), ENTITY( 必須是外部

Entity ), ENTITIES ( 以空白字元隔開 ), NMTOKEN, NMTOKENS ( 以空白字元隔開 )

ID 的值需與 XML 標記名稱命名規則相符 NameToken 的值與 XML 標記命名規則相似 ( 無字首限制 )

Enumerate 型態 (val1 | val2 | ... ) : 內容值只能從其中挑選一個 , 也可以有

Default 或 IMPLIED 值 NOTATION (notation_name1 | notation_name2 | ... ):

內容值是只能從其中挑選一個 notation name

Page 16: 單元 2-1 : XML 文件類型定義

DTD 屬性定義範例<!ELEMENT A (…) ><!ATTLIST A id ID #REQUIRED>

<!ELEMENT A (…) ><!ATTLIST A link IDREF #REQUIRED>

<!ELEMENT A (…) ><!ATTLIST A name CDATA #IMPLIED>

<!ELEMENT A (…) ><!ATTLIST A opt (o1 | o2 | o3) "o1">

Page 17: 單元 2-1 : XML 文件類型定義

DTD 中的 NOTATION

描述異於 XML( 文字 ) 的資料› 如 圖形等

描述資料格式項目與外部應用程式名稱 <!NOTATION jpg SYSTEM “jpgviewer.exe”

> <!NOTATION gif SYSTEM “gifviewer.exe” >

› 一個使用 NOTATION 屬性的例子 <!ATTLIST Image type NOTATION (gif | jpg)

"gif"> <Image type="jpg" />

Page 18: 單元 2-1 : XML 文件類型定義

XML 實體的宣告 分兩類

› 「內部實體」及「外部實體」。 內部實體

› 以參考文字為主› 在 DTD 文件中宣告: <!ENTITY 指令 >› 在 XML 文件中使用: &entity;

外部實體› 以參考外部檔案的實體為主› 在 DTD 文件中宣告: <!ENTITY SYSTEM 指令 >› 在 XML 文件中使用: &entity;

Page 19: 單元 2-1 : XML 文件類型定義

在 DTD 中宣告內部實體

<!ENTITY Entity_Name Entity_Definition>

<!ENTITY :開始實體宣告Entity_Name :實體名稱Entity_Definition :對實體內容的定義 ( 文

字 )<!ENTITY MyName “Johnson">

Page 20: 單元 2-1 : XML 文件類型定義

內部實體宣告範例<!DOCTYPE Person [

<!ENTITY MyName “Johnson"><!ENTITY MyBirthday “04/09"><!ELEMENT Person (Name,Birthday,spouse?,Address, TEL)><!ELEMENT Name (#PCDATA)><!ELEMENT Birthday (#PCDATA)><!ELEMENT Spouse (Person)><!ELEMENT Address (#PCDATA)><!ELEMENT TEL (#PCDATA)>

]>

Page 21: 單元 2-1 : XML 文件類型定義

外部實體之宣告及使用

<!ENTITY Entity_Name SYSTEM Entity_URL>

<!ENTITY :實體宣告Entity_Name : 實體的名稱Entity_URL : 外部檔案資源指定器(網址

等)<!ENTITY MyWife SYSTEM “mywife.data">

Page 22: 單元 2-1 : XML 文件類型定義

外部實體宣告範例

<?xml version="1.0" standalone="yes"?> <!DOCTYPE Person [

<!ELEMENT Person (Name,Birthday,spouse?,Address,TEL)><!ELEMENT Name (#PCDATA)><!ELEMENT Birthday (#PCDATA)><!ELEMENT Spouse (Person)><!ELEMENT Address (#PCDATA)><!ELEMENT TEL (#PCDATA)><!ENTITY MyWife   SYSTEM  “ mywife.xml">

]>

Page 23: 單元 2-1 : XML 文件類型定義

XML 內外部實體參用範例<?xml version="1.0" standalone="yes" ?><!DOCTYPE Person […]><Person> <Name>&MyName;</Name> <Birthday>&MyBirthday;</Birthday> <Spouse>&MyWife;</Spouse> <Address> Taipei 101</Address> <TEL>123456789</TEL></Person>

Page 24: 單元 2-1 : XML 文件類型定義

DTD 參數型實體參考 僅限外部 DTD 定義使用 參數實體僅供 DTD 檔自己使用 定義語法如下

<!ENTITY % Entity_Name [SYSTEM|PUBLIC]? Entity_Definition ( 文字或檔案 )>

例如:參數型實體宣告<!ENTITY % attr_param "age CDATA #IMPLIED weight CDATA #REQUIRED" >

例如:參數型實體參用<!ATTLIST Person %attr_param; carrier CDATA #REQUIRED >

<!ATTLIST Person age CDATA #IMPLIED weight CDATA #REQUIRED carrier CDATA #REQUIRED>

Page 25: 單元 2-1 : XML 文件類型定義

檢驗 XML 文件是否合乎 DTD規範 (1/2)

利用本課程提供的 OnlineValidator 工具

Page 26: 單元 2-1 : XML 文件類型定義

檢驗 XML 文件是否合乎 DTD規範 (2/2)

Page 27: 單元 2-1 : XML 文件類型定義

綜合練習範例一

題意說明› 有一家寵物廠商想利用 XML 建立飼主與寵物的關係資料庫。目前廠商已經建立有關飼主( Keeper.dtd )與狗寵物的資料( DOG.dtd )如下所示。

<!-- Keeper.dtd --><!ELEMENT 飼主 (寵物+)><!ATTLIST 飼主 編號 ID #REQUIRED ><!ELEMENT 寵物 ANY>

<!-- DOG.dtd --><!ELEMENT 狗 (綽號 ,年齡 , 種類 )><!ATTLIST 狗 編號 ID #REQUIRED ><!ELEMENT 綽號 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 種類 (#PCDATA)>

問題:如何整合上述的 DTD 資料,建立 XML 文件資料 ?

Page 28: 單元 2-1 : XML 文件類型定義

可以同時使用多個 DTD 宣告嗎 ?<!-- Keeper.dtd --><!ELEMENT 飼主 (寵物+)><!ATTLIST 飼主 編號 ID #REQUIRED ><!ELEMENT 寵物 ANY>

<!-- DOG.dtd --><!ELEMENT 狗 (綽號 ,年齡 , 種類 )><!ATTLIST 狗 編號 ID #REQUIRED ><!ELEMENT 綽號 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 種類 (#PCDATA)>

<?xml version=“1.0” encoding="UTF-8" ?> <!DOCTYPE 飼主 SYSTEM "Keeper.dtd" > <!DOCTYPE 狗 SYSTEM "DOG.dtd" >

< 飼主 編號 ="E123456"> <寵物> <狗 編號 =“D001202"> <綽號 >Timmy</綽號 > <年齡>5</年齡> < 種類 >Tom</ 種類 > </狗></寵物></ 飼主 >

Page 29: 單元 2-1 : XML 文件類型定義

方案:整合內外部 DTD

<?xml version=“1.0” encoding="UTF-8" ?> <!DOCTYPE 飼主 SYSTEM "DOG.dtd" [ <!ELEMENT 飼主 (寵物+)> <!ATTLIST 飼主 編號 ID #REQUIRED> <!ELEMENT 寵物 ANY> ]

>

< 飼主 編號 ="E123456"> <寵物> <狗 編號 ="D001202"> <綽號 >Timmy</綽號 > <年齡>5</年齡> < 種類 >Tom</ 種類 > </狗> </寵物></ 飼主 >

Page 30: 單元 2-1 : XML 文件類型定義

綜合練習範例二

題意說明› 同上,但現在寵物廠商想加入貓寵物的資料

( CAT.dtd )如下所示。

<!-- CAT.dtd --><!ELEMENT 貓 (小名 ,年紀 , 品種 )><!ATTLIST 貓 編號 ID #REQUIRED ><!ELEMENT 小名 (#PCDATA)><!ELEMENT 年紀 (#PCDATA)><!ELEMENT 品種 (#PCDATA)>

問題:如何整合上述的 DTD 資料,建立 XML 文件資料 ?

Page 31: 單元 2-1 : XML 文件類型定義

利用參數型實體,整合多個外部DTD 檔

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 飼主 SYSTEM "Keeper.dtd" >

< 飼主 編號 ="E123456"> <寵物> <狗 編號 ="D001202"> <綽號 >Timmy</綽號 > <年齡>5</年齡> < 種類 >Tom</ 種類 > </狗> <貓 編號 ="C001203"> <小名 >Timmy</小名 > <年紀>5</年紀> <品種 >Tom</品種 > </貓>

</寵物></ 飼主 >

<!-- Keeper.dtd --><!ELEMENT 飼主 (寵物+)><!ATTLIST 飼主 編號 ID #REQUIRED ><!ELEMENT 寵物 ANY><!ENTITY % dog SYSTEM "DOG.dtd" ><!ENTITY % cat SYSTEM "CAT.dtd" >%dog;%cat;

<!-- DOG.dtd --><!ELEMENT 狗 (綽號 ,年齡 , 種類 )><!ATTLIST 狗 編號 ID #REQUIRED ><!ELEMENT 綽號 (#PCDATA)><!ELEMENT 年齡 (#PCDATA)><!ELEMENT 種類 (#PCDATA)>

<!-- CAT.dtd --><!ELEMENT 貓 (小名 ,年紀 , 品種 )><!ATTLIST 貓 編號 ID #REQUIRED ><!ELEMENT 小名 (#PCDATA)><!ELEMENT 年紀 (#PCDATA)><!ELEMENT 品種 (#PCDATA)>

Page 32: 單元 2-1 : XML 文件類型定義

DTD 的限制

DTD 規範了文件的結構 DTD 在早期推廣階段十分有用

› 有自己的語法› 但與 XML 不相容,所以無法動態建立 DTD 文件

DTD 資料類型短缺 DTD 無法延伸

Page 33: 單元 2-1 : XML 文件類型定義

單元複習

介紹了 DTD 的相關語法與意義 如何撰寫 DTD 文件格式定義

› 如何整合多個 DTD 檔 如何利用 DTD 與 XML 剖析器,檢驗 XML 文

件的合適性