前言
為什么我會突然學XML呢?我在學習用JSP寫Web后臺的時候,常常會看到“等價的XML語句”、“符合XML標準”等字眼,并且在我新建的JSP項目中也發(fā)現(xiàn)有很多的.xml文件,我很想知道這些.xml文件的作用以及與JSP(或者說是與Java)的聯(lián)系,就試著開始學習XML了。
簡介
XML的全稱為可擴展標記語言(eXtensible Markup Language),很多人應該都熟悉HTML(超文本標記語言, HyperText Markup Language)。與HTML一樣,XML也是一種標記語言,是一種特殊的文本標記。兩者在形式上很相似,比如都有類似這樣的符號:<xx>字符</xx>,作用上也都能用來傳輸與顯示數(shù)據(jù)。下面是一個簡單的XML文檔:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML與HTML的區(qū)別
1.在HTML中不區(qū)分大小寫,而XML對大小寫十分敏感,必須嚴格區(qū)分:
<message>This is correct<message>
<Message>This is incorrect</message>
2.在HTML中,有時不嚴格,如果上下文清楚地顯示出段落或者列表在何處結尾,那么就可以省略</p>或者</li>之類的結束標簽:
<p>This is a paragraph.
<li>HTML
<li>XML
而在XML中,省略關閉標簽是非法的,所有元素都必須有關閉標簽。而像<br />這種擁有單個標簽而沒有匹配的結束標簽的必須用一個/字符作為結尾:
<p>This is a paragraph.</p>
<br />
3.在HTML中,常會看到?jīng)]有正確嵌套的元素:
<b><i>This text is bold and italic</b></i>
在XML中,所有元素都必須彼此正確地嵌套:
<b><i>This text is bold and italic</i></b>
PS:元素是指從(且包括)開始標簽直到(且包括)結束標簽的部分。
以上面的代碼為例,正確嵌套的即為由于<i>元素是在<b>元素內(nèi)打開的,那么它必須在<b>元素內(nèi)關閉。
4.在HTML中,引導屬性值的引號是可用可不用的。在XML中,屬性值必須被引號包圍:
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
5.HTML會把多個連續(xù)的空格字符合并為一個。在XML中,文檔中的空格不會被刪減。
6.XML文檔形成一種樹結構。XML 文檔必須有一個元素是所有其他元素的父元素,該元素稱為根元素。下面的代碼形成一種樹結構:
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
7.HTML使用固有的標簽,而且都是預定義的。常見的標簽有:
- 基本標簽:
<html>、<head>、<body> - 文本標簽:
<font>、<p> - 列表標簽:
<ol>、<ul>、<li> - 表格標簽:
<table>、<tr>、<td>
此外還有<img>(插入圖像標簽)、<a>(超鏈接標簽)、<form>(表單標簽)等。
XML中并沒有固有的標簽,所有的標簽都是自定義的而且可擴展的(這也印證了XML名稱中的extensible)。以上文簡介中的代碼為例:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
-
<note>標簽告訴讀者這是一個便簽 -
<to>標簽告訴讀者便簽是寫給Tove -
<from>標簽告訴讀者便簽是Jani寫的 -
<heading>標簽告訴讀者便簽的標題為Reminder(即便簽有提醒的作用) -
<body>標簽告訴讀者便簽的內(nèi)容
這些標簽都是作者在編寫XML文檔的過程中根據(jù)要編寫的數(shù)據(jù)的含義來定義的。
8.HTML和XML都有屬性。在XML中,屬性通常提供不屬于數(shù)據(jù)組成部分的信息:
<file type="gif">computer.gif</file>
這個例子中,文件類型GIF與數(shù)據(jù)computer.gif無關,但卻告訴讀者要用處理GIF文件的程序來處理computer.gif這個文件。
下面是兩個不同的XML文檔:
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
它們的區(qū)別在于第一個文檔中sex為元素person的一個屬性,而第二個文檔中sex自身就是一個元素,它們都告訴讀者Anna Smith是一名女性。
很重要的提示:不要濫用屬性!請看下面一段代碼:
<note day="10" month="01" year="2008" to="Tove"
from="Jani" heading="Reminder" body="Don't forget me this weekend!">
</note>
這并不是XML正確的使用方式!
還有一種情況就是針對元數(shù)據(jù)的屬性:
<messages>
<note id="501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not!</body>
</note>
</messages>
這里的屬性id僅僅是一個標識符,用于標識不同的便簽note,它并不是便簽中數(shù)據(jù)的組成部分。
XML中并沒有明確規(guī)定什么時候該用元素,什么時候該用屬性,因此建議大家盡量避免使用屬性。如果需要存儲的信息感覺起來很像數(shù)據(jù),那么請使用元素,而那些元數(shù)據(jù)(有關數(shù)據(jù)的數(shù)據(jù))則應當存儲為屬性。
最重要的區(qū)別(自我認為)
- XML被設計用來存儲和傳輸數(shù)據(jù),其焦點是數(shù)據(jù)的內(nèi)容。
- HTML被設計用來顯示數(shù)據(jù),其焦點是數(shù)據(jù)的外觀。
通俗地說就是HTML旨在顯示數(shù)據(jù),而XML旨在傳輸數(shù)據(jù)。
還是以上文簡介中的代碼為例:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
想要單純地列舉出便簽寫給誰、便簽誰寫的、便簽的標題、便簽的內(nèi)容這些數(shù)據(jù),用HTML做一個無序列表就能實現(xiàn):
<html>
<head>
<title>note</title>
</head>
<body>
<li>Tove</li>
<li>Jani</li>
<li>Reminder</li>
<li>Don't forget me this weekend!</li>
</body>
</html>
這段代碼運行起來是這樣的效果:

現(xiàn)在我想問,單看這張圖,能知道這個便簽是誰寫的嗎?是Tove還是Jani?或者可能這個便簽是寫給Tove和Jani兩個人的,也許只有文檔的作者自己知道。現(xiàn)實生活中還會有更復雜的例子,比如記錄家庭成員關系的文檔、記錄某件商品價格變動的文檔,如果用HTML做成無序列表一一列舉出來的話,就會出現(xiàn)一大串人名、一大串數(shù)字,沒有其他任何的解釋信息,我想也只有作者能看懂這些文檔吧。
這就是HTML的作用,把數(shù)據(jù)顯示出來,怎么好看就怎么顯示。顯示的方式有很多種,例如用文本、列表、表格等,但顯示出的數(shù)據(jù)內(nèi)容并沒有改變,只是外觀發(fā)生了改變。
但XML就不一樣,我們可以用XML編寫出下面兩個文檔:
<family>
<grandfather>Jack</grandfather>
<grandmother>Betty</grandmother>
<father>Mike</father>
<mother>Jessie</mother>
<uncle>Felix</uncle>
<aunt>Anna</aunt>
<son>Tom</son>
<daughter>Amy</daughter>
<January></January>
</family>
<price>
<January>$35.00</January>
<February>$36.00</February>
<March>$35.60</March>
<April>$37.00</April>
<May>$38.00</May>
<June>$36.00</June>
</price>
通過以上兩個文檔,我們可以清楚地知道每個人名對應的人物關系、每個價格對應的月份。
這就是XML的作用,作者在編寫XML文檔的過程中根據(jù)數(shù)據(jù)的含義定義和擴展標簽,這樣數(shù)據(jù)就和特定的標簽聯(lián)系起來并存儲,在傳輸?shù)倪^程中讀者通過這些標簽能夠明白數(shù)據(jù)的含義。
肯定會有人有疑問:為什么不在HTML中使用類似的<grandfather>、<January>這些標簽呢?很抱歉,HTML沒有預定義這些標簽,并且HTML中的標簽不能擴展,只能使用預定義好的標簽。
又有人會說,我也可以用HTML將數(shù)據(jù)的含義顯示出來呀,就像這樣:
<html>
<head>
<title>note</title>
</head>
<body>
<li>to:Tove</li>
<li>from:Jani</li>
<li>heading:Reminder</li>
<li>body:Don't forget me this weekend!</li>
</body>
</html>
這確實是個很不錯的方法,讀者也能看懂數(shù)據(jù)的含義。但如果編寫文檔的目的只是方便用戶在需要的時候查看文檔中存儲的數(shù)據(jù)然后關閉的話,就沒有必要寫這么冗長、繁瑣的一段代碼了。利用XML編寫,幾行代碼就能搞定,而且用記事本打開.xml文件就能查看:

這就是XML比HTML優(yōu)秀的地方,代碼雖短,卻能完整、清楚地顯示出數(shù)據(jù)及其含義,同時又方便查看,可以跨平臺使用。
后記
作為兩種不同的語言,HTML有它的好處,XML也有它的優(yōu)點。我寫本文的目的并不是在這兩者中評一個孰優(yōu)孰劣,我只是想把一些XML的基礎語法和我自己對這門語言的理解與感悟分享給大家。每門語言就像不同的工具,用最合適的語言高效地編寫程序、完成項目,我覺得這才是一名程序員要努力做到的。