參考資料(簡中版)
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拿來分析用的,例如一讀到「<」就表示標籤的開始,這五個標籤分別是
「<」=「<」
「>」= 「>」
「&」=「&」
「'」=「'」
「"」=「"」
要打這五個符號就用等號右邊的方式打出來
但假設我想打「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可用,按右鍵可發現很多功能
沒有留言:
張貼留言