DTD 規則 [XML Lab.] [黃振修] 何謂 DTD ? 文件類型定義 –Document Type Definition –自訂我們所使用的標籤 用XML來建立文件規則 –DTD就像是一本規則手冊 –允許作者建立相同類型的新文件 –藉由繼承可擁有與基底文件相同的特性 –Valid XML必須嚴格的遵守DTD規則 DTD 結構 外部DTD子集 –存在文件以外,通常是一份通用的DTD 內部DTD子集 –包含在文件PROLOG宣告部分 文件能包含兩種以上的子集 –內部子集會被優先處理 –可以覆蓋(override)外部子集的定義 DTD 語法 XML spec採用Backus Naur Form (BNF) 定義, 相關文法如下: – XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' – SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) – doctypedecl ::= ‘<!DOCTYPE’ S Name (S ExternalID)? S? (‘[’ (markupdecl | PEReference | S)* ‘]’ S?)? ‘>’ – ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral 內部 DTD (#1) <?xml version=“1.0”?> <!DOCTYPE EMAIL [ <!ELEMENT EMAIL (TO, FROM, CC, SUBJECT, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> <EMAIL> <TO>[email protected]</TO> <FROM>[email protected]</FROM> <CC>[email protected]</CC> <SUBJECT>Hello XML</SUBJECT> <BODY>blah, blah</BODY> </EMAIL> 內部 DTD (#2) 用IE來檢視XML文件 內部 DTD (#3) 在上面的例子中,XML parser會用DTD來 驗證文件的有效性(valid) 直接將elements定義在doctypedecl 方括弧 [] 內部 內部子集會被優先處理 若文件包含外部集內部子集, 會覆蓋 (override)先前外部字集的定義 外部 DTD (#1) <!DOCTYPE EMAIL (SYSTEM|PUCLIB) “email.dtd”> 外部實體 –SYSTEM緊接在URI之後,用來告訴處理器哪 裡可以找到宣告中被參照的物件 –對廣大的使用者而言,一些DTD已經被確立 為標準是有效的,這時就使用PUCLIB關鍵 字,後面應接一個有效的標準函式庫 可把文件對實體的宣告寫在另一個外部 檔案,使用時直接參照外部實體 外部 DTD (#2) 使用外部DTD的例子 example.xml <?xml version=“1.0” encoding=“BIG5” standalone=“yes”?> <!DOCTYPE EMAIL SYSTEM “email.dtd”> .... email.dtd <?xml version=“1.0” encoding=“ISO-8859-1”?> <!ELEMENT EMAIL (TO, FROM, CC, SUBJECT, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> 元素宣告 Grammar elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>‘ contentspec ::= 'EMPTY' | 'ANY' | Mixed | children Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')‘ children ::= (choice | seq) ('?' | '*' | '+')? 元素宣告釋義(#1) EMPTY –用來宣告不能包含任何內容的元素 ex: <BR/> ANY –可包含任何DTD允許的內容 並以任何順序出現 混合型(Mixed) –宣告為一組可選擇的內容,以 | 區隔, ex: <!ELEMENT EXAMPLE (#PCDATA|x|y|z)*> 元素宣告釋義(#2) #PCDATA 可解析的字元資料,包含標籤,會被XML parser處理的資訊 #CDATA 不可解析的字元資料,即普通文字,可包 含作為保留標籤的字元, ex: <![CDATA[<TEST>LaLaLa</TEST>]]> 元素宣告釋義(#3) 結構符號 () 括弧內的選擇 (A,B) , 分隔串列元素 (A,B,C) | 或(可選擇) ? 一次或不出現 (A?,B) * 零次或以上 (A,B*) + 一次或以上 (A,B,C+) (A|B) 屬性宣告 Grammar AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' AttDef ::= S Name S AttType S DefaultDecl AttType ::= StringType | TokenizedType | EnumeratedType TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) 屬性概念 屬性提供關於元素或元素內容的相關資 訊,例如: <font color=“red”>TEST</font> 即表示紅色是TEST字串的屬性 屬性通常包含了重要訊息,但卻不屬於 元素內容的一部份 屬性宣告可出現在DTD中任何部分,但是 放在較近於對應的元素宣告處,比較易 於為人了解 例子(續) ... <!ELEMENT EMAIL (TO, FROM, CC, BCC, SUBJECT, BODY)> <!ATTLIST EMAIL LANGUAGE (Western|Greek|Chinese) “Chinese” ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) “NORMAL”> ... <!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED “TRUE”> ... 內部實體 <!ENTITY EntityName EntityDefinition> 內部實體在DTD中被宣告,並包含文件 會用到內容 例如: <!ENTITY SIGNATURE “ChenHsiu”> 會把SIGNATURE這個實體加到DTD中, 並且日後這個實體在文件中被參照時, 會被置換成實體的內容: ChenHsiu <BODY> Hello, This is &SIGNATURE;! </BODY> 參數實體 <!ENTITY % HIDDEN “CDATA #FIXED “TRUE””> 參數實體和一般實體相同,但是在語 意方面有顯著不同 參數實體在DTD中被宣告,並包含 “DTD中”會用到內容 宣告過後的實體可在“DTD中”的其 他地方被參考到 <!ATTLIST BCC HIDDEN %HIDDEN;> INCLUDE & IGNORE <![IGNORE[DTD section]]> <![INCLUDE[DTD section]]> IGNORE以及INCLUDE關鍵字可以讓使 用者將DTD的某部分關閉或是開啟 允許作者在追蹤各種不同的變化時, 可測試各種不同的結構 <![IGNORE[<!ELEMENT BCC(#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED “TRUE”>]]> <![INCLUDE[<!ELEMENT SUBJECT (#PCDATA)>]]> INCLUDE & IGNORE <![IGNORE[DTD section]]> <![INCLUDE[DTD section]]> IGNORE以及INCLUDE關鍵字可以讓使 用者將DTD的某部分關閉或是開啟 允許作者在追蹤各種不同的變化時, 可測試各種不同的結構 <![IGNORE[<!ELEMENT BCC(#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED “TRUE”>]]> <![INCLUDE[<!ELEMENT SUBJECT (#PCDATA)>]]> 處理指令 處理指令(PI)提供指令給正在處理這 份文件的應用程式 PI通常出現在一份文件的前言中,但 是他們能被放在XML文件中任意地方 <?AVI CODEC=“VIEDO1” COLORS=“256”?> <?WAV COMPRESSOR=“ADPCM” RESOLUTION=“16”?> 必要的標籤宣告 一份格式正確(well-formed)的文件 不需要讀取DTD – 就算格式正確的文件中,每個外部實體仍 需被宣告. parser可能不需要處理外部 DTD,但是仍可能需要處理內部DTD 必須在XML中加入必要的標籤宣告,我 們稱為RMD – NONE:皆不處理DTD – INTERNAL:只處理內部DTD – ALL:必須處理任何有效的內部外部DTD 語彙 XML語彙是一組實際元素與特殊文件 類型的結構,在DTD中定義的語彙是給 規則書用的 – – – – 頻道定義格式 開放金融資訊交換 開放軟體描述 電子資料交換
© Copyright 2024 ExpyDoc