Transcript 投影片 - 銘傳大學
能夠理解DTD的相關語法與意義 能夠運用DTD撰寫一份文件格式定義 能夠結合DTD與XML parser,檢驗XML文件 的合適性 文件格式定義(Document Type Definition) 定義XML文件的「格式」(Format),亦即 XML文件需要包含那些「標記」(tag)、「屬 性」(attribute)、實體(entities)以及標記 之間的結構等等 XML資料 合格的 XML文件 DTD文件 DTD文件規範 XML 剖析器 有效的XML 文件 規範XML文件的格式 › 方便XML文件的交換與應用程式的處理 › 建立資料交換的標準 定義出具以下特性的文件格式規範 › 「通用性」(general) › 「完整性」(complete) 可重複使用XML文件格式定義 宣告的方式 › 內部文件格式定義之宣告 › 外部文件格式定義之宣告 <!DOCTYPE 根元素名稱 [ ......... ]> 「<!DOCTYPE」是宣告的開始。 「根元素名稱」放您DTD定義的根元素名稱。 「[」及「]」是DTD定義的開始與結束符號。 「.......」為您要定義的DTD。 DOCTYPE宣告須在XML宣告之後,任何元素 宣告之前 可以有幾個DTD宣告? <!DOCTYPE 根元素名稱 SYSTEM|PUBLIC "DTD_URI" ["DTD_URL"]> 外部DTD宣告的語法主要區分成兩大 類: › 「SYSTEM」:私有用途 › 「PUBLIC」:公開用途 <!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"> ELEMENT › 定義XML元素 ATTLIST › 定義XML元素的屬性 <!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> 分為五種 EMPTY元素 沒有文字內容或子元素, (但可以有屬性) <!ELEMENT Somedata EMPTY > 子元素 (sub-element) 如 <!ELEMENT DOG (Nickname, Breeder, Birthday, HowOld, Breed)> 文字資料 (text) 如 <!ELEMENT Nickname (#PCDATA)> 混合 (mixed) #PCDATA一定要出現在第一個 包含文字內容或子元素 <!ELEMENT element_name (#PCDATA | ..|...)*> ANY元素 任何其它被宣告過的元素以及任何文字資料。 對於此元素之標籤不限制其次數及次序。 <!ELEMENT SomeElm ANY > 符號 ? › * › + › 沒有符號 › 允許出現次數 零或一次 大於等於零次 大於等於一次 一次 <!ELEMENT A (B?, C*, D+, E) > <!ELEMENT A (B, (C, D)?, (E, F)*, (G, H)+, (I, J)) > <!ELEMENT A (B)* > 我們希望子元素有選擇空間(只能選其一)時使 用 例:學歷有很多種可選擇 <!ELEMENT 教育程度(高中|大學|碩士|博士)> 教育程度下只能有高中, 大學, 碩士或博士 相關選項 「#PCDATA」(一定要放在第一位) 加上其它元素可以選擇 例:可選擇的職業 <!ELEMENT 職業 (#PCDATA | 教育| 學生| 資訊 相關)*> 職業下可以是文字或是任何教育, 學生, 資訊相關的 組合 <!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> CDATA TOKEN型態 屬性值的文字資料 (注意:#PCDATA只適用在指定元素的 文字內容) ID, IDREF, IDREFS(以空白字元隔開), ENTITY(必須是外部 Entity ), ENTITIES (以空白字元隔開), NMTOKEN, NMTOKENS (以空白字元隔開) ID的值需與XML標記名稱命名規則相符 NameToken的值與XML標記命名規則相似(無字首限制) Enumerate型態 (val1 | val2 | ... ) : 內容值只能從其中挑選一個, 也可以 有Default 或 IMPLIED 值 NOTATION (notation_name1 | notation_name2 | ... ): 內容值是只能從其中挑選一個notation name <!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"> 描述異於XML(文字)的資料 › 如 圖形等 描述資料格式項目與外部應用程式名稱 <!NOTATION jpg SYSTEM “jpgviewer.exe” > <!NOTATION gif SYSTEM “gifviewer.exe” > › 一個使用NOTATION屬性的例子 <!ATTLIST Image type NOTATION (gif | jpg) "gif"> <Image type="jpg" /> 分兩類 › 「內部實體」及「外部實體」。 內部實體 › 以參考文字為主 › 在DTD文件中宣告:<!ENTITY 指令> › 在XML文件中使用:&entity; 外部實體 › 以參考外部檔案的實體為主 › 在DTD文件中宣告:<!ENTITY SYSTEM 指令> › 在XML文件中使用:&entity; <!ENTITY Entity_Name Entity_Definition> <!ENTITY :開始實體宣告 Entity_Name :實體名稱 Entity_Definition:對實體內容的定義(文字) <!ENTITY MyName “Johnson"> <!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)> ]> <!ENTITY Entity_Name SYSTEM Entity_URL> <!ENTITY :實體宣告 Entity_Name: 實體的名稱 Entity_URL: 外部檔案資源指定器(網址等) <!ENTITY MyWife SYSTEM “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)> <!ENTITY MyWife SYSTEM “mywife.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檔自己使用 定義語法如下 <!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> 利用本課程提供的OnlineValidator工具 題意說明 › 有一家寵物廠商想利用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文件資料? <!-- 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</種類> </狗> </寵物> </飼主> <!-- DOG.dtd --> <!ELEMENT 狗 (綽號,年齡, 種類)> <!ATTLIST 狗 編號 ID #REQUIRED > <!ELEMENT 綽號 (#PCDATA)> <!ELEMENT 年齡 (#PCDATA)> <!ELEMENT 種類 (#PCDATA)> <?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文件資料? <!-- 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)> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 飼主 SYSTEM "Keeper.dtd" > <飼主 編號="E123456"> <寵物> <狗 編號="D001202"> <綽號>Timmy</綽號> <年齡>5</年齡> <種類>Tom</種類> </狗> <貓 編號="C001203"> <小名>Timmy</小名> <年紀>5</年紀> <品種>Tom</品種> </貓> </寵物> </飼主> DTD規範了文件的結構 DTD 在早期推廣階段十分有用 › 有自己的語法 › 但與XML不相容,所以無法動態建立 DTD文件 DTD資料類型短缺 DTD無法延伸 介紹了DTD的相關語法與意義 如何撰寫DTD文件格式定義 › 如何整合多個DTD檔 如何利用DTD與XML剖析器,檢驗XML文件的 合適性