XML文件格式已經出來很久了。他的風頭如今在JSON、YAML等新興文件格式的沖擊下已經顯的不那么強勁。但是XML仍然是當今世界上使用最廣泛的文件格式。圍繞着它也有一大堆的概念和知識點。所以我們還是很有必要全面了解下。
XML
XML全稱為eXtensible Markup Language,即可擴展標記語言。其被設計用來傳輸及存儲數據。
XML與HTML看似比較相似,但是其設計目的並不相同。
XML用來傳輸及存儲數據,主要關注數據是什么。
HTML用來顯示數據,主要關注數據看起來是什么樣。
HTML的tag是預定義的,比如說table標簽,瀏覽器會知道它是什么含義。
XML的tag不是預定義的,需要自己設計tag並描述tag的含義。XML中的tag如果不借助XSLT文件,瀏覽器只會以簡單的文本方式展示。
很多人認為HTML是XML文件的一個子集。其實這種觀點是錯誤的,因為HTML的實現並未嚴格遵循XML的語法。比如XML要求每個tag必須要有閉合標記,XML的tag是大小寫敏感的,XML給tag添加的屬性必須要使用引號包起來…這些語法要求HTML都不滿足。
請看XML的一個示例。
1 2 3 4 5 6 7 |
|
這是一個簡單的XML文件。第一行說明了xml的版本及編碼類型。接下來是一個根節點book,根節點可以包含很多子節點。
XML命名空間
由於XML的tag並不像HTML那樣是預定義的,那么很有可能兩個XML中的同名tag具有不同的含義。那么在合並XML等操作時勢必會造成沖突。解決的辦法就是給XML的tag加上命名空間(即namespace),每一個namespace都可以指定一個前綴。這些前綴會區分同名tag。
假設這里有另一個xml文件。
1 2 3 4 5 6 |
|
如果我們要合並這兩個xml節點到同一個xml文件中時,不加namespace會發生沖突,因為含有同名的tag,其子節點的結構並不相同。接下來我們給其加上命名空間並合並。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
xmlns是xml namespace的縮寫。引號后面是tag的前綴。這個前綴可以省略,比如xmlns="http://www.huangbowen.net/ns1"
,相當於沒有前綴的tag自動應用默認的命名空間。需要注意的是命名空間的URI只是給命名空間提供一個唯一的標識,xml解析器並不會訪問這個URI來獲取任何信息。很多公司習慣將這個URI一個web頁面,該web頁面描述了該namespace的相關信息。
XSD
XSD全稱為XML Schema Definition,即XML結構定義語言。每個XSD文件是對一個XML文件的結構定義。 由於XML中的tag並不是預定義的,那么每人都可以創建自己的XML結構文檔。如果你想讓別人按照你的標准創建一份xml文件,你可以使用XSD文件來描述你的標准。
這是針對本文示例book.xml文件的一個XSD文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
從上可以看出其實XSD文件本身就是一個XML文件,它遵循XML語法,比如每個tag都需要有結束標記,必須有且只有一個根節點等。
在一個XML文件中可以添加其Schema的引用信息。
1 2 3 4 5 6 7 |
|
在IDE中,如果你的XML節點沒有遵守你引用的Schema中的定義,就會給出錯誤提醒。
XSLT
XSLT全稱為EXtensible Stylesheet Language Transformations。 XSLT用於將XML文檔轉換為XHTML或其他XML文檔。
在講XSLT之前我們先講講XSL。XSL全稱為Extensible Stylesheet Language,即可擴展樣式表語言。眾所周知,CSS是HTML文件的樣式表,而XSL則是XML文件的樣式表。XSL文件描述了XML文件應該如何被顯示。
其實XSL不僅僅是樣式表語言,它主要包含3部分:
XSLT - 用來轉換XML文檔
XPath - 查詢和操作XML文檔中的節點
XSL-FO - 格式化XML文檔
XSLT使用XPath來查找XML中的元素。
XSLT通過一個xml文件來定義源xml文件與目標文件之間的轉換關系。該xml文件必須以<xsl:stylesheet>
或<xsl:transform>
作為根節點。
對於本文的示例book.xml,如果我們使用瀏覽器打開顯示效果如下。
現在我們創建一個XSLT文件將其轉換為一個HTML文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
然后我們在book.xml文件中加入對這個XSLT文件的引用。
1 2 3 4 5 6 7 8 |
|
接下來我們再用瀏覽器打開book.xml文件,發現顯示變成了這樣。是不是很神奇?
注意如果你使用chrome打開該book.xml文件,請設置chrome的--allow-file-access-from-files
屬性,這樣chrome才允許加載本地的xsl文件。解決方案看這里:http://stackoverflow.com/questions/3828898/can-chrome-be-made-to-perform-an-xsl-transform-on-a-local-file
OK,這篇文章講的夠多了,下篇接着講XPath,XML to Object以及XML文檔格式與近來風頭強勁的JSON、YAML格式的比較。