DTD 規則

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中定義的語彙是給
規則書用的
–
–
–
–
頻道定義格式
開放金融資訊交換
開放軟體描述
電子資料交換