xml檔案

xml檔案

xml檔案是Extentsible Markup Language(可擴展標記語言)的縮寫。XML文檔可以是有效的(valid),但並非一定要求有效。所謂有效文檔是指其符合其文檔類型定義(DTD)的文檔。


XML:Extentsible Markup Language(可擴展標記語言)的縮 寫,是用來定義其它語言的一種元語言,其前身是SGML(標準通用標記語言)。它沒有標籤集(tag set),也沒有語法規則(grammatical rule),但 是它有句法規則(syntax rule)。任何XML文檔對任何類型的套用以及正確 的解析都必須是良構的(well-formed),即每一個打開的標籤都必須有匹配的結束標籤,不得含有次序顛倒的標籤,並且在語句構成上應符合技術規範的要求。 XML文檔可以是有效的(valid),但並非一定要求有效。所謂有效文檔是指其符合其文檔類型定義(DTD)的文檔。如果一個文檔符合一個模式(schema)的規定 ,那么這個文檔是"模式有效的(schema valid)"。
簡單地說,你的電腦上安裝過了windows media player,使用wmp的時候可以設定windows media player與某些設備同步,比如和光碟機同步可以實現自動播放音樂光碟等等。使用設備設定同步的時候,會放置一個名為WMPInfo.xml的檔案,以跟蹤同步關係。如果刪除了該檔案,將導致windows media player丟失其與設備的同步關係信息。

■創建xml檔案的工具

xml檔案和html檔案一樣,實際上是一個文本檔案。顯然大家立刻就會明白,創建xml檔案最普通的工具和html一樣,就是“記事本”了。除了“記事本”之外,當然還有一些更加方便的工具,如xml notepad、xml pro、clip!xml editor等,這些工具的一大特點是:能夠檢查你所建立的xml檔案是否符合xml規範。不過,現在這些工具都只有英文版的,並且需要付費使用。當然,你仍然能夠使用frontpage、dreamweaver等工具,不過使用起來不是很方便。隨著xml的逐漸普及,相信在不久後,也會出現非常好用的創建xml檔案的工具。

■一個xml檔案的例子

現在我們暫且使用“記事本”來創建我們的xml檔案吧。先看一個xml檔案:
例1
——————————————————————
〈?xml version="1.0" encoding="gb2312" ?〉
〈參考資料〉
〈書籍〉
〈名稱〉xml入門精解〈/名稱〉
〈作者〉張三〈/作者〉
〈價格 貨幣單位="人民幣"〉20.00〈/價格〉
〈/書籍〉
〈書籍〉
〈名稱〉xml語法〈/名稱〉
〈!--此書即將出版--〉
〈作者〉李四〈/作者〉
〈價格 貨幣單位="人民幣"〉18.00〈/價格〉
〈/書籍〉
〈/參考資料〉
——————————————————————
這是一個典型的xml檔案,編輯好後保存為一個以.xml為後綴的檔案。我們可以將此檔案分為檔案序言(prolog)和檔案主體兩個大的部分。在此檔案中的第一行即是檔案序言。該行是一個xml檔案必須要聲明的東西,而且也必須位於xml檔案的第一行,它主要是告訴xml解析器如何工作。其中,version是標明此xml檔案所用的標準的版本號,必須要有;encoding指明了此xml檔案中所使用的字元類型,可以省略,在你省略此聲明的時候,後面的字元碼必須是unicode字元碼(建議不要省略)。因為我們在這個例子中使用的是gb2312字元碼,所以encoding這個聲明也不能省略。在檔案序言部分還有一些聲明語句,我們在後面給予介紹。
檔案的其餘部分都是屬於檔案主體,xml檔案的內容信息存放在此。我們可以看到,檔案主體是由開始的〈參考資料〉和結束的〈/參考資料〉控制標記組成,這個稱為xml檔案的“根元素”;〈書籍〉是作為直屬於根元素下的“子元素”;在〈書籍〉下又有〈名稱〉、〈作者〉、〈價格〉這些子元素。貨幣單位是〈價格〉元素中的一個“屬性”,“人民幣”則是“屬性值”。元素與屬性的關係如圖1。
〈!--此書即將出版--〉這一句同html一樣,是注釋,在xml檔案里,注釋部分是放在“〈!--”與“--〉”標記之間的部分。
大家可以看到,xml檔案是相當簡單的。同html一樣,xml檔案也是由一系列的標記組成,不過,xml檔案中的標記是我們自定義的標記,具有明確的含義,我們可以對標記中的內容的含義作出說明。

■xml檔案的語法

對xml檔案有了初步的印象之後,我們就來詳細地談一談xml檔案的語法。在講語法之前,我們必須要了解一個重要的概念,就是xml解析器(xml parse)。
1. xml解析器
解析器的主要功能就是檢查xml檔案是否有結構上的錯誤,剝離xml檔案中的標記,讀出正確的內容,以交給下一步的應用程式處理。xml是一種用來結構化檔案信息的標記語言,xml規範中對於如何標記檔案的結構性有一個詳細的法則,解析器就是根據這些法則寫出來的軟體(多用java寫成)。同html一樣,在瀏覽器中,必須有html的解析器,這樣瀏覽器才能夠“讀懂”各種用html標記所組成的網頁,將它們顯示在我們面前。如果有瀏覽器的html解析器讀不懂的標記,將會返回給我們錯誤信息。
由於現在的html標記實際上相當混亂,存在大量不規範的標記(有的網頁用ie能正常顯示,而用Netscape Navigator則不行),所以從一開始,xml的設計者就嚴格規定了xml的語法和結構,我們編寫的xml檔案必須遵循這些規定,否則xml解析器將毫不留情地給你顯示錯誤信息,解析流程圖見圖2。
有兩種xml檔案,一種是well-formed xml檔案,一種是validating xml檔案。
如果一個xml檔案滿足xml規範中的某些相關法則,且沒有使用dtd(檔案格式定義——後詳述)時,可稱這份檔案是well-formed。而如果一個xml檔案是well-formed,且正確地使用了dtd,dtd中的語法又是正確的,那么這個檔案就是validating。對應兩種xml檔案,有兩種xml解析器,一種是well-formed 解析器,一種是validating解析器。ie 5中就內含validating解析器,validating解析器也可用來解析well-formed xml檔案,
檢查它是否滿足了well-formed的條件。我們可以將剛才編輯的第一個xml 檔案用ie 5以上版本的瀏覽器打開(圖3)。
看到圖3以後,大家可能要問為什麼在瀏覽器中的顯示和我的源檔案一樣?沒錯,因為對於xml檔案,我們僅僅關心它的內容,而它的顯示形式是交給css或xsl來完成的。這裡,我們並沒有給這個xml檔案定義它的css或xsl檔案,所以它按照原來的形式來顯示。實際上,對於電子數據交換,僅僅需要一個xml檔案即可,如果要將它以某種形式顯示出來,我們就必須編輯css或xsl檔案(這個問題會在以後討論)。
2. well-formed的xml檔案
我們知道,xml必須是well-formed的,才能夠被解析器正確地解析出來,顯示在瀏覽器中。那么什麼是well-formed的xml檔案呢?主要有下面幾個準則,我們在創建xml檔案的時候,必須滿足它們。
首先,xml檔案的第一行必須是聲明該檔案是xml檔案以及它所使用的xml規範版本。在檔案的前面不能夠有其它元素或者注釋。
第二,在xml檔案中有且只能夠有一個根元素。我們的第一個例子中,〈參考資料〉... 〈/參考資料〉就是此xml檔案的根元素。
第三,在xml檔案中的標記必須正確地關閉,也就是說,在xml檔案中,控制標記必 須有與之對應的結束標記。如:〈名稱〉標記必須有對應的〈/名稱〉結束標記,不像html,某些標記的結束標記可有可無。如果在xml檔案中遇到自成一個單元的標記,就是類似於html 中的〈img src=.....〉的這些沒有結束標記的時候,xml把它稱為“空元素”,必須用這樣的寫法:〈空元素名/〉,如果元素中含有屬性時寫法則為:〈空元素名 屬性名=“屬性值”/〉。
第四,標記之間不得交叉。在以前的html檔案中,可以這樣寫:
〈b〉〈h〉xxxxxxx〈/b〉〈/h〉,〈b〉和〈h〉
標記之間有相互重疊的區域,而在xml中,是嚴格禁止這樣標記交錯的寫法,標記必須以規則性的次序來出現。
第五,屬性值必須要用“ ”號括起來。如第一個例子中的“1.0”、“gb2312”、“人民幣”。都是用“ ”號括起來了的,不能漏掉。
第六,控制標記、指令和屬性名稱等英文要區分大小寫。與html不同的是,在html中, 類似〈b〉和〈b〉的標記含義是一樣的,而在xml中,類似〈name〉、〈name〉或〈name〉這樣的標記是不同的。
第七,我們知道,在html檔案中,如果我們要瀏覽器原封不動地將我們所輸入的東西顯示出來,可以將這些東西放到〈pre〉〈/pre〉或者〈XMP〉〈/xmp〉標記中間。這對於我們創建html教學的網頁是必不可少的,因為網頁中要顯示html的原始碼。而在xml中,要實現這樣的功能,就必須使用cdata標記。在cdata標記中的信息被解析器原封不動地傳給應用程式,並且不解析該段信息中的任何控制標記。cdata區域是由:“〈![cdata[”為開始標記,以“]]〉”為結束標記。例如:例2中的源碼,除了“〈![cdata[”和“]]〉”符號,其餘的內容解析器將原封不動地交給下游的應用程式,即使cdata區域中的開始和結尾的空白以及換行字元等,都同樣會被轉交(注意cdata是大寫的字元)。
例2
〈![cdata[飛翔的xml〉〉〉〉〉,:-)
oooo〈〈〈〈〈〈〈
]]〉
第八,xml處理空白字元和html不一樣。html標準規定,不管有多少個空白,都當作一個空白來處理;而在xml中規定,所有標記以外的空白,解析器都要忠實地交給下游的應用程式處理。這樣,我們有時必須摒棄編寫html檔案時的縮排習慣,因為縮排的空格,解析器也要處理。如:
〈作者〉張三〈/作者〉

〈作者〉
張三
〈/作者〉
上述內容對於解析器來說是不同的(後者在〈作者〉〈/作者〉標記之內除了張三這個字元以外,還包括兩個換行記號以及“張三”前的文字縮排符號)。所以解析器在去掉標記後將信息傳給應用程式將有不同的處理結果。
如果我們想明確地告訴xml程式,標記中的空白有明確的含義,不要隨便去掉(如在一些詩中,空格有它具體的意義),則可在標記中加入一個xml內置的屬性——xml:space 。如(注意屬性名稱和值的大小寫):
〈詩歌 xml:space="preserver"〉
祖國啊! 祖國!
我的祖國!
〈/詩歌〉
另外,在xml檔案中,如果要用到表1的特殊字元,必須用相應符號代替。

表1
特殊字元 替代符號
&& &
< &it;
> &gt;
" &quot;
&#039; &apos;

在此做個小結:符合上述規定的xml檔案就是well-formed的xml檔案。這是編寫xml檔案的最基本要求。可以看到xml檔案的語法規定比html要嚴格多了。由於有這樣的嚴格規定,軟體工程師編寫xml的解析器就容易多了,不像編寫html語言的解析器,必須費盡心思去適應不同的網頁寫法,提高自己瀏覽器的適應能力。實際上,這對於我們初學者來說,也是一件好事。該怎樣就怎樣,不必像原來那樣去疑惑各種html的寫法。
我們看到,在xml檔案中,用的大多都是自定義的標記。但是大家考慮一下,如果兩個同行業的公司a和b要用xml檔案相互交換數據,a公司用〈價格〉標記來表示他們產品的價格信息,而b公司可能用〈售價〉來表示價格信息。如果一個xml應用程式來讀取他們各自的xml檔案中的信息時,如果它只知道〈價格〉標記里表示的是價格信息,那么b公司的價格信息就讀不出來,必將產生錯誤。顯然,對於想利用xml檔案來交換信息的實體來說,他們之間必須有一個約定——即編寫xml檔案可以用哪些標記,母元素中能夠包括哪些子元素,各個元素出現的順序,元素中的屬性怎樣定義等。這樣他們在用xml交換數據時才能夠暢通無阻。這種約定稱為dtd(document type definition,文檔格式定義)。可以把dtd看作編寫xml檔案的模板。對於同行業之間的xml數據交換,有一個固定的dtd將會方便很多。比如說,如果網上的各大電子商場的xml網頁都遵循同一個dtd時,那么我們就可以輕鬆地依據這個dtd 編寫一個應用程式,去網上將我們感興趣的東西自動抓回來。事實上已經有了好幾個定義好的dtd,如前面所說的mathml、smil等。
如果一個xml檔案是well-formed的,並且它是正確的依據某個dtd建立的,那么,這個xml檔案就被稱為:validating xml檔案。相應的解析器就稱為:validating parser。

相關詞條

相關搜尋

熱門詞條

聯絡我們