前言
為什么我會突然學(xué)XML呢忽肛?我在學(xué)習(xí)用JSP寫Web后臺的時候,常常會看到“等價的XML語句”、“符合XML標(biāo)準(zhǔn)”等字眼乾翔,并且在我新建的JSP項目中也發(fā)現(xiàn)有很多的.xml文件,我很想知道這些.xml文件的作用以及與JSP(或者說是與Java)的聯(lián)系嗡呼,就試著開始學(xué)習(xí)XML了纸俭。
簡介
XML的全稱為可擴(kuò)展標(biāo)記語言(eXtensible Markup Language),很多人應(yīng)該都熟悉HTML(超文本標(biāo)記語言南窗, HyperText Markup Language)揍很。與HTML一樣,XML也是一種標(biāo)記語言万伤,是一種特殊的文本標(biāo)記窒悔。兩者在形式上很相似,比如都有類似這樣的符號:<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對大小寫十分敏感,必須嚴(yán)格區(qū)分:
<message>This is correct<message>
<Message>This is incorrect</message>
2.在HTML中聋庵,有時不嚴(yán)格膘融,如果上下文清楚地顯示出段落或者列表在何處結(jié)尾,那么就可以省略</p>
或者</li>
之類的結(jié)束標(biāo)簽:
<p>This is a paragraph.
<li>HTML
<li>XML
而在XML中祭玉,省略關(guān)閉標(biāo)簽是非法的氧映,所有元素都必須有關(guān)閉標(biāo)簽。而像<br />
這種擁有單個標(biāo)簽而沒有匹配的結(jié)束標(biāo)簽的必須用一個/
字符作為結(jié)尾:
<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:元素是指從(且包括)開始標(biāo)簽直到(且包括)結(jié)束標(biāo)簽的部分。
以上面的代碼為例振峻,正確嵌套的即為由于<i>
元素是在<b>
元素內(nèi)打開的臼疫,那么它必須在<b>
元素內(nèi)關(guān)閉。
4.在HTML中铺韧,引導(dǎo)屬性值的引號是可用可不用的多矮。在XML中,屬性值必須被引號包圍:
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
5.HTML會把多個連續(xù)的空格字符合并為一個哈打。在XML中塔逃,文檔中的空格不會被刪減。
6.XML文檔形成一種樹結(jié)構(gòu)料仗。XML 文檔必須有一個元素是所有其他元素的父元素湾盗,該元素稱為根元素。下面的代碼形成一種樹結(jié)構(gòu):
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
7.HTML使用固有的標(biāo)簽立轧,而且都是預(yù)定義的格粪。常見的標(biāo)簽有:
- 基本標(biāo)簽:
<html>
、<head>
氛改、<body>
- 文本標(biāo)簽:
<font>
帐萎、<p>
- 列表標(biāo)簽:
<ol>
、<ul>
胜卤、<li>
- 表格標(biāo)簽:
<table>
疆导、<tr>
、<td>
此外還有<img>
(插入圖像標(biāo)簽)葛躏、<a>
(超鏈接標(biāo)簽)澈段、<form>
(表單標(biāo)簽)等。
XML中并沒有固有的標(biāo)簽舰攒,所有的標(biāo)簽都是自定義的而且可擴(kuò)展的(這也印證了XML名稱中的extensible)败富。以上文簡介中的代碼為例:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
-
<note>
標(biāo)簽告訴讀者這是一個便簽 -
<to>
標(biāo)簽告訴讀者便簽是寫給Tove -
<from>
標(biāo)簽告訴讀者便簽是Jani寫的 -
<heading>
標(biāo)簽告訴讀者便簽的標(biāo)題為Reminder
(即便簽有提醒的作用) -
<body>
標(biāo)簽告訴讀者便簽的內(nèi)容
這些標(biāo)簽都是作者在編寫XML文檔的過程中根據(jù)要編寫的數(shù)據(jù)的含義來定義的。
8.HTML和XML都有屬性摩窃。在XML中兽叮,屬性通常提供不屬于數(shù)據(jù)組成部分的信息:
<file type="gif">computer.gif</file>
這個例子中,文件類型GIF與數(shù)據(jù)computer.gif
無關(guān),但卻告訴讀者要用處理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
僅僅是一個標(biāo)識符观挎,用于標(biāo)識不同的便簽note
琴儿,它并不是便簽中數(shù)據(jù)的組成部分。
XML中并沒有明確規(guī)定什么時候該用元素嘁捷,什么時候該用屬性造成,因此建議大家盡量避免使用屬性。如果需要存儲的信息感覺起來很像數(shù)據(jù)雄嚣,那么請使用元素晒屎,而那些元數(shù)據(jù)(有關(guān)數(shù)據(jù)的數(shù)據(jù))則應(yīng)當(dāng)存儲為屬性。
最重要的區(qū)別(自我認(rèn)為)
- XML被設(shè)計用來存儲和傳輸數(shù)據(jù)缓升,其焦點(diǎn)是數(shù)據(jù)的內(nèi)容鼓鲁。
- HTML被設(shè)計用來顯示數(shù)據(jù),其焦點(diǎn)是數(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>
想要單純地列舉出便簽寫給誰歧寺、便簽誰寫的燥狰、便簽的標(biāo)題、便簽的內(nèi)容這些數(shù)據(jù)斜筐,用HTML做一個無序列表就能實(shí)現(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>
這段代碼運(yùn)行起來是這樣的效果:
現(xiàn)在我想問龙致,單看這張圖,能知道這個便簽是誰寫的嗎顷链?是Tove還是Jani净当?或者可能這個便簽是寫給Tove和Jani兩個人的,也許只有文檔的作者自己知道≡塘剩現(xiàn)實(shí)生活中還會有更復(fù)雜的例子,比如記錄家庭成員關(guān)系的文檔俘闯、記錄某件商品價格變動的文檔潭苞,如果用HTML做成無序列表一一列舉出來的話,就會出現(xiàn)一大串人名真朗、一大串?dāng)?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>
通過以上兩個文檔笑窜,我們可以清楚地知道每個人名對應(yīng)的人物關(guān)系、每個價格對應(yīng)的月份登疗。
這就是XML的作用排截,作者在編寫XML文檔的過程中根據(jù)數(shù)據(jù)的含義定義和擴(kuò)展標(biāo)簽,這樣數(shù)據(jù)就和特定的標(biāo)簽聯(lián)系起來并存儲辐益,在傳輸?shù)倪^程中讀者通過這些標(biāo)簽?zāi)軌蛎靼讛?shù)據(jù)的含義断傲。
肯定會有人有疑問:為什么不在HTML中使用類似的<grandfather>、<January>這些標(biāo)簽?zāi)睾衫埃亢鼙秆藁冢琀TML沒有預(yù)定義這些標(biāo)簽,并且HTML中的標(biāo)簽不能擴(kuò)展女仰,只能使用預(yù)定義好的標(biāo)簽猜年。
又有人會說,我也可以用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í)是個很不錯的方法乔外,讀者也能看懂?dāng)?shù)據(jù)的含義。但如果編寫文檔的目的只是方便用戶在需要的時候查看文檔中存儲的數(shù)據(jù)然后關(guān)閉的話一罩,就沒有必要寫這么冗長杨幼、繁瑣的一段代碼了。利用XML編寫聂渊,幾行代碼就能搞定差购,而且用記事本打開.xml文件就能查看:
這就是XML比HTML優(yōu)秀的地方,代碼雖短汉嗽,卻能完整欲逃、清楚地顯示出數(shù)據(jù)及其含義,同時又方便查看饼暑,可以跨平臺使用稳析。
后記
作為兩種不同的語言洗做,HTML有它的好處,XML也有它的優(yōu)點(diǎn)彰居。我寫本文的目的并不是在這兩者中評一個孰優(yōu)孰劣诚纸,我只是想把一些XML的基礎(chǔ)語法和我自己對這門語言的理解與感悟分享給大家。每門語言就像不同的工具陈惰,用最合適的語言高效地編寫程序畦徘、完成項目,我覺得這才是一名程序員要努力做到的奴潘。