文章出處

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的一個示例。

book.xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<book>
    <name>Effective JavaScript</name>
    <category>Program Language</category>
    <author>Bowen</author>
    <description>This book is about JavaScript Language.</description>
</book>

這是一個簡單的XML文件。第一行說明了xml的版本及編碼類型。接下來是一個根節點book,根節點可以包含很多子節點。

XML命名空間

由于XML的tag并不像HTML那樣是預定義的,那么很有可能兩個XML中的同名tag具有不同的含義。那么在合并XML等操作時勢必會造成沖突。解決的辦法就是給XML的tag加上命名空間(即namespace),每一個namespace都可以指定一個前綴。這些前綴會區分同名tag。

假設這里有另一個xml文件。

anotherBook.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="ISO-8859-1"?>
<book>
    <name>Rework</name>
    <page>120</page>
    <publishDate>2013-10-08</publishDate>
</book>

如果我們要合并這兩個xml節點到同一個xml文件中時,不加namespace會發生沖突,因為含有同名的tag,其子節點的結構并不相同。接下來我們給其加上命名空間并合并。

combined.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<root>
<ns1:book xmlns:ns1="http://www.huangbowen.net/ns1">
    <ns1:name>Effective JavaScript</name>
    <ns1:category>Program Language</category>
    <ns1:author>Bowen</author>
    <ns1:description>This book is about JavaScript Language.</description>
</book>

<ns2:book xmlns:ns2="http://www.huangbowen.net/ns2">
     <ns2:name>Rework</name>
    <ns2:page>120</page>
    <ns2:publishDate>2013-10-08</publishDate>
     </book>
</root>

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文件。

book.xsd
1
2
3
4
5
6
7
8
9
10
11
12
13
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:string" name="name"/>
                <xs:element type="xs:string" name="category"/>
                <xs:element type="xs:string" name="author"/>
                <xs:element type="xs:string" name="description"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

從上可以看出其實XSD文件本身就是一個XML文件,它遵循XML語法,比如每個tag都需要有結束標記,必須有且只有一個根節點等。

在一個XML文件中可以添加其Schema的引用信息。

book.xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<ns1:book xmlns:ns1="http://www.huangbowen.net/ns1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:targetLocation="http://www.huangbowen.net/book.xsd">
    <ns1:name>Effective JavaScript</name>
    <ns1:category>Program Language</category>
    <ns1:author>Bowen</author>
    <ns1:description>This book is about JavaScript Language.</description>
</book>

在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文件。

book.xsl
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
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My Book</h2>
  <table border="1">
    <tr>
      <td>name</td>
      <td><xsl:value-of select="book/name" /></td>
    </tr>
    <tr>
      <td>category</td>
      <td><xsl:value-of select="book/category" /></td>
    </tr>
    <tr>
      <td>author</td>
      <td><xsl:value-of select="book/author" /></td>
    </tr>
    <tr>
      <td>description</td>
      <td><xsl:value-of select="book/description" /></td>
    </tr>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

然后我們在book.xml文件中加入對這個XSLT文件的引用。

book.xml
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<book>
    <name>Effective JavaScript</name>
    <category>Program Language</category>
    <author>Bowen</author>
    <description>This book is about JavaScript Language.</description>
</book>

接下來我們再用瀏覽器打開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格式的比較。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()