2016年11月3日 星期四

DTD

參考資料(英文版)
參考資料(簡中版)
XML編程通常都會用XML spy這種工具,但我這裡用的是Eclipse,首先介紹如何新建xml
在package按右建New-->Other...會出現如下的畫面
 紅字是副檔名,這篇會用到dtd和xml,xsd下一篇會講,這裡先選擇xml,然後直接Finish


※Test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ELEMENT root (first, second, third, fourth)>
    <!ELEMENT first (#PCDATA)>
    <!ELEMENT second (#PCDATA)>
    
    <!ELEMENT third (t1, t2)>
    <!ELEMENT t1 (#PCDATA)>
    <!ELEMENT t2 (#PCDATA)>
    
    <!ELEMENT fourth (#PCDATA)>
]>
<root>
    <first>one</first>
    <second>
        <![CDATA[
            &
        ]]>
    </second>
    <third>
        <t1>three-one</t1>
        <t2>three-two</t2>
    </third>
    <fourth>four</fourth>
</root>

※root是xml最外層的tag,只要是xml tag,都可以隨便打,圓括號裡的是它的子元素

※#PCDATA表示裡面沒有子元素,所以就這麼一種

※third那行表示其下還有兩個子元素

※<second>裡有CDATA將「&」包起來,是因為在xml裡有五個符號直接打出來會編譯錯誤,因為xml拿來分析用的,例如一讀到「<」就表示標籤的開始,這五個標籤分別是
「<」=「&lt;」
「>」= 「&gt;」
「&」=「&amp;」
「'」=「&apos;」
「"」=「&quot;」
要打這五個符號就用等號右邊的方式打出來

但假設我想打「if(a>b & a < c)」,這在寫程式裡常常用到,如果我一篇文章打下來都用等號右邊的那種方式,可讀性不高,所以又有了CDATA的方式來使用,只要XML讀到
「<![CDATA[」就知道之後的字都不管,一直讀到有「]]>」為止

※元素名稱後面一定要有空格

※可以在編輯程式碼的地方按右鍵Validate

出現左上角的圖示才表示程式是沒有問題的,不會驗證第一行的UTF-8,把它刪除也可驗證成功



※四種符號和ANY、EMPTY

<!DOCTYPE root [
    <!ELEMENT root (first?, second+, third*, (fourth1|fourth2|fourth3), (f1|f2|f3)?, fifth, sixth)>
    <!ELEMENT first (#PCDATA)>
    <!ELEMENT second (#PCDATA)>
    
    <!ELEMENT third (t1?, t2)>
    <!ELEMENT t1 (#PCDATA)>
    <!ELEMENT t2 (#PCDATA)>
    
    <!ELEMENT fourth (#PCDATA)>
    <!ELEMENT fifth EMPTY>
    <!ELEMENT sixth ANY>
]>
<root>
    <second>second</second>
    <third>
        <t1>three-one</t1>
        <t2>three-two</t2>
    </third>
    <third>
        <t2>three-two</t2>
    </third>
    <fourth1>four1</fourth1>
    <fifth />
    <sixth>
        <third>
            <t1>three-one</t1>
            <t2>three-two</t2>
        </third>
    </sixth>
</root>


?:0~1
+:1~多
*:0~多
|:多擇一
上個程式碼的子元素名稱,後面都沒有加如上的四個符號,就表示一定要出現,而且只能出現1次

※ANY:還可以包括其他的xml tag,沒定義的當然不行

※EMPTY:內容只能是空的,有兩種方式
「<fitth />」和「<fifth></fifth>」



※引用dtd

就是dtd和xml分開,可以讓很多xml用
先新增一個dtd檔,就是第一張圖選DTD File

※test.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT root (first?, second+, third*, (fourth1|fourth2|fourth3), (f1|f2|f3)?, fifth, sixth)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
    
<!ELEMENT third (t1?, t2)>
<!ELEMENT t1 (#PCDATA)>
<!ELEMENT t2 (#PCDATA)>
    
<!ELEMENT fourth1 (#PCDATA)>
<!ELEMENT fourth2 (#PCDATA)>
<!ELEMENT fourth3 (#PCDATA)>
    
<!ELEMENT f1 (#PCDATA)>
<!ELEMENT f2 (#PCDATA)>
<!ELEMENT f3 (#PCDATA)>
    
<!ELEMENT fifth EMPTY>
<!ELEMENT sixth ANY>

※此時裡面只能有dtd的語法,不然驗證會錯,也就是不要DOCTYPE開頭

※新增xml引用dtd
如果新增xml直接finish,預設是最下面的XML template,schema下一篇會說明



選剛剛新增的dtd,另外一個radio button是系統的dtd,想看裡面的內容可以到
Window-->Preferences-->XML-->XML catalog
就可以在本機找到jar,然後再用解壓縮軟體繼續開啟裡面的路徑

※繼續下一步後
如果dtd驗證沒過,Root element的下拉就沒得選,且Finish也是disabled


※Test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "../test.dtd" >
<root>
    <second>second</second>
    <third>
        <t1>three-one</t1>
        <t2>three-two</t2>
    </third>
    <third>
        <t2>three-two</t2>
    </third>
    <fourth1>four1</fourth1>
    <fifth />
    <sixth />
</root>

※DOCTYPE的root是頂層tag的名稱

※路徑還可以用完整路徑,但前面要加file:///,如「file:///D:\abc\test.dtd」

※雖然沒加file:///,按ctrl再按路徑名稱也可以連的到,但驗證就是不會過

※SYSTEM那裡有兩個選項,另一個是PUBLIC
SYSTEM:表示私人的意思
PUBLIC:表示公用的意思

※用Eclipse新增jsp檔時會出現如下的DOCTYPE
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

※html當然就是最頂層的tag了

※有兩個字串,第一個字串的第一個字有分三種
「ISO」:表示ISO組織批准的
「+」:表示標準組織制定的,但不是ISO組織批准的
「-」:表示非標準組織制定的

後面再接DTD的擁有者
再來是DTD的描述
再來是語言

※第二個字串是DTD的路徑



※屬性

※Test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ELEMENT root (first, second)>
    <!ELEMENT first (#PCDATA)>
    <!ATTLIST first ooo CDATA #IMPLIED>
    <!ATTLIST first id ID #REQUIRED>
    <!ATTLIST first zzz CDATA #REQUIRED>
    
    <!ELEMENT second (#PCDATA)>
    <!ATTLIST second xxx CDATA 'defalut'>
    <!ATTLIST second type CDATA #FIXED "fix value">
]>
<root>
    <first id="a" zzz="">one</first>
    <second xxx='sss'>sss</second>
</root>

※ATTLIST表示要宣告屬性,然後元素名、屬性名、型態、預設值,用空格隔開

※這裡的CDATA和上面介紹的CDATA意思不一樣,這裡是指字串的型態,還有很多,請參考w3c網站

※預設值除了寫死的以外,還有三種方式
#REQUIRED:必要的
#IMPLIED:可選的
#FIXED value:固定值的,所以後面有值;使用者可以不寫,但一寫就有寫這裡設定的值,否則驗證過不了

※ID型態表示唯一,且一定要有值(空格、空白都不行),如上面的id和zzz,zzz可以是空的



※實體

很像變數的功能,有兩種,「&」和「%」
&:在xml、dtd定義都可以,使用時只能在xml使用,使用時,用「&」和「;」包起來即可
%:定義和使用都只能在dtd,使用時,用「%」和「;」包起來即可

※Test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ELEMENT root (first, second)>
    <!ELEMENT first (#PCDATA)>
    <!ELEMENT second (#PCDATA)>
    
    <!ENTITY xxx "abc">
    <!ENTITY ooo "def">
]>
<root>
    <first>&xxx;</first>
    <second>&ooo;</second>
</root>

※xxx是abc;ooo是def,要使用變數時,要用「&」和「;」包起來即可

※因為%只能在dtd,所以以下用dtd檔

※test.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT root (first, second)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
    
<!ENTITY xxx "abc">
<!ENTITY % zzz "def">
<!ATTLIST second %zzz; CDATA 'a'>

※定義zzz的dtd變數為def,而元素second的屬性就是def

※test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "Test.dtd" >
<root>
    <first>&xxx;</first>
    <second def="a">%zzz;</second>
</root>

※此時%zzz;當然不會出現def,只是寫死的字串而已

※我用XML Spy的browser的功能,試&功能沒成功,也沒有錯誤,只是出來的結果是空的,不知為什麼?

※如果dtd/xsd改了,xml一時之間不知道要打什麼,可以將xml刪除,重新增加一個xml檔,import進來就會產生一些值了,比較不會打錯,也可以如下的方式一點一點增加
在Eclipse的Window-->Perspective-->Open Perspective-->Other...
然後選XML視圖,會有Outline可用,按右鍵可發現很多功能


沒有留言:

張貼留言