投影片 - 銘傳大學

Download Report

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文件的
合適性