330 likes | 437 Views
單元 2-1 : XML 文件類型定義. 王豐緒 銘傳大學資工系. 單元目標. 能夠 理解 DTD 的相關語法與意義 能夠 運用 DTD 撰寫一份文件格式定義 能夠結合 DTD 與 XML parser , 檢驗 XML 文件的合適性. 何謂 DTD ?. 文件格式定義 ( Document Type Definition )定義 XML 文件的「 格式 」( Format), 亦即 XML 文件需要包含那些「 標記 」( tag)、「 屬性 」( attribute)、 實體 ( entities) 以及 標記之間的 結構 等等. XML 資料. 合格的 XML 文件.
E N D
單元2-1:XML文件類型定義 王豐緒 銘傳大學資工系
單元目標 • 能夠理解DTD的相關語法與意義 • 能夠運用DTD撰寫一份文件格式定義 • 能夠結合DTD與XML parser,檢驗XML文件的合適性
何謂DTD? 文件格式定義(Document Type Definition)定義XML文件的「格式」(Format),亦即XML文件需要包含那些「標記」(tag)、「屬性」(attribute)、實體(entities)以及標記之間的結構等等 XML資料 合格的XML文件 XML 剖析器 有效的XML文件 DTD文件 DTD文件規範
使用DTD有什麼樣的好處 • 規範XML文件的格式 • 方便XML文件的交換與應用程式的處理 • 建立資料交換的標準 • 定義出具以下特性的文件格式規範 • 「通用性」(general) • 「完整性」(complete) • 可重複使用XML文件格式定義 • 宣告的方式 • 內部文件格式定義之宣告 • 外部文件格式定義之宣告
內部DTD文件格式定義之宣告 <!DOCTYPE 根元素名稱 [ ......... ]> • 「<!DOCTYPE」是宣告的開始。 • 「根元素名稱」放您DTD定義的根元素名稱。 • 「[」及「]」是DTD定義的開始與結束符號。 • 「.......」為您要定義的DTD。 • DOCTYPE宣告須在XML宣告之後,任何元素宣告之前 • 可以有幾個DTD宣告?
外部DTD文件格式定義之宣告 • 外部DTD宣告的語法主要區分成兩大類: • 「SYSTEM」:私有用途 • 「PUBLIC」:公開用途 <!DOCTYPE 根元素名稱 SYSTEM|PUBLIC"DTD_URI"["DTD_URL"]>
參數說明 <!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">
DTD基本標示指令 • ELEMENT • 定義XML元素 • ATTLIST • 定義XML元素的屬性
元素的設定:ELEMENT • <!ELEMENTElement_Name(Element_Definition)> • <!ELEMENT:指名定義XML元素 • Element_Name:XML元素的名稱 • Element_DefinitionXML元素的內容 • 子元素的順序,次數,資料型態等 <A> <B>bbbbb</B> <C>ccccc</C> <D>ddddd</D> </A> <!ELEMENTA(B, C, D) > <!ELEMENTB (#PCDATA) > <!ELEMENTC (#PCDATA) > <!ELEMENTD (#PCDATA) >
在DTD中定義XML元素之類型 • 分為五種 • EMPTY元素 • 沒有文字內容或子元素, (但可以有屬性) • <!ELEMENTSomedataEMPTY> • 子元素 (sub-element) • 如 <!ELEMENTDOG(Nickname,Breeder,Birthday,HowOld,Breed)> • 文字資料 (text) • 如 <!ELEMENTNickname (#PCDATA)> • 混合(mixed) • 包含文字內容或子元素 • <!ELEMENTelement_name(#PCDATA | ..|...)*> • ANY元素 • 任何其它被宣告過的元素以及任何文字資料。 • 對於此元素之標籤不限制其次數及次序。 • <!ELEMENTSomeElmANY > #PCDATA一定要出現在第一個
宣告標記可出現的次數 • 符號 允許出現次數 • ? 零或一次 • * 大於等於零次 • + 大於等於一次 • 沒有符號 一次 <!ELEMENTA(B?, C*, D+, E) > <!ELEMENTA(B, (C, D)?, (E, F)*, (G, H)+, (I, J)) > <!ELEMENTA(B)* >
選擇區隔符號:| • 我們希望子元素有選擇空間(只能選其一)時使用 • 例:學歷有很多種可選擇<!ELEMENT教育程度(高中|大學|碩士|博士)>教育程度下只能有高中, 大學, 碩士或博士
混合型元素 • 相關選項 • 「#PCDATA」(一定要放在第一位) • 加上其它元素可以選擇 • 例:可選擇的職業<!ELEMENT 職業 (#PCDATA | 教育| 學生| 資訊相關)*>職業下可以是文字或是任何教育, 學生, 資訊相關的組合
定義XML元素的屬性(ATTLIST) • <!ATTLISTelement_nameattr_nameattr_typeattr_dafaults> • attr_defaults • #REQUIRED (此屬性為必要的, 一定要給值) • #IMPLIED (此屬性為可有可無的, 可給可不給) • #FIXEDxxxx (此屬性值是xxxx,不能改變) • xxxx (此屬性可給可不給,預設值是xxxx, 但可以改變) • attr_type • 文字型態(CDATA) • Tokenized • 列舉式型態(enumerated) 例句:<!ATTLIST飼主生日CDATA#IMPLIED>
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
DTD屬性定義範例 <!ELEMENTA(…) > <!ATTLIST A id ID #REQUIRED> <!ELEMENTA(…) > <!ATTLIST A link IDREF #REQUIRED> <!ELEMENTA(…) > <!ATTLIST A name CDATA #IMPLIED> <!ELEMENTA(…) > <!ATTLIST A opt (o1 | o2 | o3) "o1">
DTD中的NOTATION • 描述異於XML(文字)的資料 • 如 圖形等 • 描述資料格式項目與外部應用程式名稱 • <!NOTATION jpg SYSTEM “jpgviewer.exe” > • <!NOTATION gif SYSTEM “gifviewer.exe” > • 一個使用NOTATION屬性的例子 • <!ATTLISTImagetypeNOTATION(gif | jpg)"gif"> • <Image type="jpg" />
XML實體的宣告 • 分兩類 • 「內部實體」及「外部實體」。 • 內部實體 • 以參考文字為主 • 在DTD文件中宣告:<!ENTITY指令> • 在XML文件中使用:&entity; • 外部實體 • 以參考外部檔案的實體為主 • 在DTD文件中宣告:<!ENTITYSYSTEM 指令> • 在XML文件中使用:&entity;
在DTD中宣告內部實體 <!ENTITY Entity_NameEntity_Definition> • <!ENTITY :開始實體宣告 • Entity_Name:實體名稱 • Entity_Definition:對實體內容的定義(文字) <!ENTITYMyName“Johnson">
內部實體宣告範例 <!DOCTYPE Person [ <!ENTITYMyName“Johnson"> <!ENTITYMyBirthday“04/09"> <!ELEMENT Person (Name,Birthday,spouse?,Address, TEL)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Birthday (#PCDATA)> <!ELEMENT Spouse (Person)> <!ELEMENT Address (#PCDATA)> <!ELEMENT TEL (#PCDATA)> ]>
外部實體之宣告及使用 <!ENTITY Entity_NameSYSTEMEntity_URL> • <!ENTITY :實體宣告 • Entity_Name:實體的名稱 • Entity_URL:外部檔案資源指定器(網址等) <!ENTITYMyWifeSYSTEM“mywife.data">
外部實體宣告範例 <?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)> <!ENTITYMyWifeSYSTEM“mywife.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>
DTD參數型實體參考 • 僅限外部DTD定義使用 • 參數實體僅供DTD檔自己使用 • 定義語法如下 • <!ENTITY%Entity_Name [SYSTEM|PUBLIC]?Entity_Definition(文字或檔案)> • 例如:參數型實體宣告<!ENTITY % attr_param "ageCDATA #IMPLIEDweight CDATA #REQUIRED" > • 例如:參數型實體參用<!ATTLIST Person %attr_param; carrier CDATA #REQUIRED > <!ATTLISTPerson age CDATA #IMPLIED weight CDATA #REQUIRED carrier CDATA #REQUIRED>
檢驗XML文件是否合乎DTD規範(1/2) • 利用本課程提供的OnlineValidator工具
綜合練習範例一 • 題意說明 • 有一家寵物廠商想利用XML建立飼主與寵物的關係資料庫。目前廠商已經建立有關飼主(Keeper.dtd)與狗寵物的資料(DOG.dtd)如下所示。 <!-- DOG.dtd --> <!ELEMENT 狗 (綽號,年齡, 種類)> <!ATTLIST 狗 編號 ID#REQUIRED > <!ELEMENT 綽號 (#PCDATA)> <!ELEMENT 年齡 (#PCDATA)> <!ELEMENT 種類 (#PCDATA)> <!-- Keeper.dtd --> <!ELEMENT 飼主 (寵物+)> <!ATTLIST 飼主 編號 ID #REQUIRED> <!ELEMENT 寵物 ANY> 問題:如何整合上述的DTD資料,建立XML文件資料?
可以同時使用多個DTD宣告嗎? <!-- DOG.dtd --> <!ELEMENT 狗 (綽號,年齡, 種類)> <!ATTLIST 狗 編號 ID#REQUIRED > <!ELEMENT 綽號 (#PCDATA)> <!ELEMENT 年齡 (#PCDATA)> <!ELEMENT 種類 (#PCDATA)> <!-- Keeper.dtd --> <!ELEMENT 飼主 (寵物+)> <!ATTLIST 飼主 編號 ID#REQUIRED > <!ELEMENT 寵物 ANY> <?xml version=“1.0” encoding="UTF-8"?> <!DOCTYPE 飼主 SYSTEM "Keeper.dtd" > <!DOCTYPE 狗 SYSTEM "DOG.dtd" > <飼主 編號="E123456"> <寵物> <狗 編號=“D001202"> <綽號>Timmy</綽號> <年齡>5</年齡> <種類>Tom</種類> </狗> </寵物> </飼主>
方案:整合內外部DTD <?xml version=“1.0” encoding="UTF-8"?> <!DOCTYPE飼主 SYSTEM "DOG.dtd" [ <!ELEMENT 飼主 (寵物+)> <!ATTLIST 飼主 編號 ID#REQUIRED> <!ELEMENT 寵物 ANY> ] > <飼主 編號="E123456"> <寵物> <狗 編號="D001202"> <綽號>Timmy</綽號> <年齡>5</年齡> <種類>Tom</種類> </狗> </寵物> </飼主>
綜合練習範例二 • 題意說明 • 同上,但現在寵物廠商想加入貓寵物的資料(CAT.dtd)如下所示。 <!-- CAT.dtd --> <!ELEMENT 貓 (小名,年紀, 品種)> <!ATTLIST 貓 編號 ID#REQUIRED > <!ELEMENT 小名 (#PCDATA)> <!ELEMENT 年紀 (#PCDATA)> <!ELEMENT 品種 (#PCDATA)> 問題:如何整合上述的DTD資料,建立XML文件資料?
利用參數型實體,整合多個外部DTD檔 <!-- Keeper.dtd --> <!ELEMENT 飼主 (寵物+)> <!ATTLIST 飼主 編號 ID#REQUIRED > <!ELEMENT 寵物 ANY> <!ENTITY % dog SYSTEM "DOG.dtd" > <!ENTITY % cat SYSTEM "CAT.dtd" > %dog; %cat; <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 飼主 SYSTEM "Keeper.dtd" > <飼主 編號="E123456"> <寵物> <狗 編號="D001202"> <綽號>Timmy</綽號> <年齡>5</年齡> <種類>Tom</種類> </狗> <貓 編號="C001203"> <小名>Timmy</小名> <年紀>5</年紀> <品種>Tom</品種> </貓> </寵物> </飼主> <!-- DOG.dtd --> <!ELEMENT 狗 (綽號,年齡, 種類)> <!ATTLIST 狗 編號 ID#REQUIRED > <!ELEMENT 綽號 (#PCDATA)> <!ELEMENT 年齡 (#PCDATA)> <!ELEMENT 種類 (#PCDATA)> <!-- CAT.dtd --> <!ELEMENT 貓 (小名,年紀, 品種)> <!ATTLIST 貓 編號 ID#REQUIRED > <!ELEMENT 小名 (#PCDATA)> <!ELEMENT 年紀 (#PCDATA)> <!ELEMENT 品種 (#PCDATA)>
DTD的限制 • DTD規範了文件的結構 • DTD 在早期推廣階段十分有用 • 有自己的語法 • 但與XML不相容,所以無法動態建立 DTD文件 • DTD資料類型短缺 • DTD無法延伸
單元複習 • 介紹了DTD的相關語法與意義 • 如何撰寫DTD文件格式定義 • 如何整合多個DTD檔 • 如何利用DTD與XML剖析器,檢驗XML文件的合適性