XML筆記
首先:學習XML需要有一定的HTML和JavaScript的基礎
一、什么是XML
XML是可擴展標記語言 eXtensible Markup Language
多用來傳輸和儲存數據
- XML是一種標記語言
- XML是用來傳輸數據的語言而不是顯示數據
- XML語言需要自行定義標簽并且具有自我描述性
- XML在意的是數據內容(傳輸信息)
- HTML在意的是數據的外觀(顯示信息)
舉例說明:XML文檔實例 Jani寫給Tove的便簽
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面的這條便簽具有自我描述性。它包含了發(fā)送者和接受者的信息,同時擁有標題以及消息主體。但是,這個 XML 文檔仍然沒有做任何事情。它僅僅是包裝在 XML 標簽中的純粹的信息。我們需要編寫軟件或者程序,才能傳送、接收和顯示出這個文檔。
通過XML可以發(fā)明自己的標簽
- 上述例子中標簽中沒有在任何XML標準中定義過
<to>和<form>XML中沒有預定義的標簽相 - 對比HTML中的標簽全都是通過HTML定義過的標簽
- XML允許創(chuàng)業(yè)者定義自己的標簽和自己的文檔結構
二、XML的用途
XML把數據從HTML分離
首先舉一個例子當你需要在HTML文檔中顯示動態(tài)數據,那么每當數據改變的時候,都要花費我們大量的時間去編輯HTML。通過XML數據能夠給儲存在獨立的XML文件中。這樣我們就可以專注于使用HTML/CSS進行顯示和布局,并且可以在修改底層數據的時候不在需要對HTML進行改變。通過使用幾行JavaScript代碼,我們可以讀取一個外部XML文件,并更新我們的網頁數據內容。
XML簡化數據共享
XML數據以純文本格式進行存儲,因此提供了一種獨立與軟件和硬件的數據儲存方法。這就可以讓創(chuàng)建不懂應用程序可以共享的數據變得更加容易
簡化數據傳輸
互聯(lián)網上的不兼容的系統(tǒng)之間交換數據對于程序員來說是一件很費時的事情,這時yogaXML交換數據就降低了從不兼容的應用程序中讀取數據的復雜性
三、XML的樹結構
XML文檔形成了一種樹的結構,它從“根部”開始,然后擴展到 "枝葉"。
樹結構是通常被稱為 XML 樹,并且可以很容易地描述任何 XML 文檔。
通過采用樹狀結構,你可以知道所有從根開始的后續(xù)的分行及支行。
一個XML文檔實例
XML 文檔使用簡單的具有自我描述性的語法:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第一行是XML的生命。它定義XML的版本(1.0)和所使用的編碼(ISO-8859-1 = Latin-1 / 西歐字符集)。下一行描述文檔的根元素(比如說:本文檔是一個標簽):
<note>
接下來的四行描述根的四個子元素(to,form,heading以及body):
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
最后一行的定義根元素的結尾:
</note>
這個事例中描述的是一張Jani寫給Tove的便簽顯示出了XML具有獨特的自我描述性
XML文檔形成一種樹結構
XML文檔必須包含根元素。鈣元素是所有其他元素的父元素。
XML文檔中的元素形成了一顆文檔樹。
這棵樹從根部開始,并擴展到樹的最低端。
所有的元素都可以有子元素:
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
父、子以及通報等術語用于描述元素之間的關系。父元素擁有子元素。相同層級上的子元素成為問題(兄弟或姐妹)。
所有的元素都可以有文本內容和屬性(類似HTML中)。
實例XML中的一本書:

<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
實例中的根元素是<bookstore>。文檔中的所有<book>元素都被包含在<bookstore>中。<book>元素中有四個子元素:<title>、<author>、<year>、<price>。
XML語法
語法規(guī)則
所有XML都必須有一個關閉標簽
在HTML中,有些元素不必須有一個關閉標簽:
<p>This is a paragraph.
<br>
而在XML中,省略關閉標簽是非法的
<?xml version="1.0" encoding="UTF-8" ?>
<p>This is a paragraph.</p>
注釋:打開標簽和關閉標簽通常被稱為開始標簽和結束標簽,本質上是相同的。
XML是大小寫敏感的語言
XML標簽對大小寫敏感,需要用相同的大小寫來編寫打開標簽和關閉標簽
<Message>This is incorrect</message>
<message>This is correct</message>
XML必須正確嵌套
在HTML中,經常會有沒有正確嵌套的元素:
<b><i>This text is bold and italic</b></i>
而在XML中,所有元素都必須彼此正確的嵌套
<b><i>This text is bold and italic</i></b>
兩者的區(qū)別是i和b的結束標簽是否要和i和b的起始標簽相對應。
XML文檔必須有根元素
XML文檔必須有一個元素是所有其他元素的父元素。該元素為根元素。
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
XML屬性值必須加引號
與HTML類似,XML元素也可以擁有屬性(名稱、值得對)。
在XML中、XML的屬性值必須加引號。
請研究下面兩個XML文檔。第一個是錯誤的,第二個是正確的:
<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
實體引用
在XML中,一些字符擁有特殊的意義
如果我們把字符"<"放到XML元素中,會發(fā)生錯誤,這是因為解析器會把它當做新元素的開始。
這樣會產生XML錯誤:
<message>if salary < 1000 then</message>
為了避免這個錯誤需要用實體引用來代替"<"字符
<message>if salary < 1000 then</message>
在XML中,有五個預定義的實體引用:
在XML中,只有字符“<”和“&”確實是非法的,大于號是合法的但是用實體引用來代替它是好的習慣

注釋:在XML中,只有字符“<”和“&”確實是非法的。大于號是合法的,但是用實體引用來代替是推薦的方式
XML中的注釋
XML中注釋和HTML中的注釋相同
在XML中,空格會被保留
HTML會把多個連續(xù)的空格字符裁減合并為一個
| HTML | hello tove |
|---|---|
| Output | hello tove |
XML以LF儲存換行
在Windows程序中,換行通常是以一對字符來存儲的:回車符(CR)和換行符(LF)。
在Unix和Mac OSX中,使用LF來存儲新行。
XML元素
XML元素概述
XML元素是XML文檔中不可缺少的,可以將XML元素看成是一個容器,其中存放了文本、元素、屬性,媒體對象或所有的這些。
XML文檔包含XML元素。
每個XML文檔包含一個或者多個元素,其范圍是任一分隔的有開始和結束標記,或者為空元素,用一個空元素標簽。
什么是XML元素?
XML元素指的是從(且包括)開始標簽到(且包括)結束標簽的部分。
一個元素可以包含:
- 其他元素
- 文本
- 屬性
- 或混合以上所有
<bookstore>
<<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
上述代碼描述的是bookstore中的兩本書
book元素也有屬性,<title>、<author>、<year> 和 <price> 有文本內容,因為他們包含文本。
XML元素的命名規(guī)則
XML元素必須遵從一下命名規(guī)則
名稱可以包含字母、數字以及其他字符
名稱不能以數字或者標點符號開始
名稱不能以字母xml(不區(qū)分大小寫的任何xml 組合)開始
名稱不能包含空格
可使用任何名稱,沒有保留的字詞。
最佳命名習慣
使名稱具有描述性。使用下劃線的名稱也很不錯:<first_name>、<last_name>。
名稱應簡短和簡單,比如:<book_title>,而不是:<the_title_of_the_book>。
避免 "-" 字符。如果您按照這樣的方式進行命名:"first-name",一些軟件會認為您想要從 first 里邊減去 name。
避免 "." 字符。如果您按照這樣的方式進行命名:"first.name",一些軟件會認為 "name" 是對象 "first" 的屬性。
避免 ":" 字符。冒號會被轉換為命名空間來使用(稍后介紹)。
XML 文檔經常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。有一個實用的經驗,即使用數據庫的命名規(guī)則來命名 XML 文檔中的元素。
在 XML 中,éòá 等非英語字母是完全合法的,不過需要留意,您的軟件供應商不支持這些字符時可能出現(xiàn)的問題。
XML元素是可擴展的
XML元素的擴展,便于攜帶更多的信息。
如下XML實例
請看下面的 XML 實例:
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
設想我們創(chuàng)建了一個應用程序,可將<to>、<from> 以及 <body>元素從XML文檔中提取出來,并產生以下的輸出:

這時我們可以在文檔中添加一些額外的信息:
<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
我們即使加上了這些內容程序不會因此而崩潰或者中斷,這個程序仍然可以找到XML中的 to、from 以及 body元素,并且產生同樣的輸出。XML的優(yōu)勢之一,就是可以在不中斷應用程序的情況下進行擴展。
另外:XML中,所有的元素必須有結束標記!
XML屬性
XML的屬性
在XML的元素中,一個XML元素可以有一個或多個屬性。
屬性是XML元素的一部分,每一個元素可以有多個獨特的屬性。屬性提供了有關XML元素的詳細信息XML屬性始終都是一個 名稱/值 的對
在HTML中,屬性提供有關元素的額外信息。
<img src="computer.gif">
<a href="demo.html">
屬性通常提供不屬于數據組成部分的信息。在下面的實例中,文件類型與數據無關,但是對需要處理這個元素的軟件來說卻很重要:
<file type="gif">computer.gif</file>
XML屬性必須加引號
屬性值必須被引號包圍,不過單引號雙引號都可以使用EP:
<person sex = "female">
/or
<person sex = 'female'>
如果屬性本身包含雙引號可以使用單引號
<gangster name='George "Shotgun" Ziegler'>
或者可以使用字符實體:
<gangster name="George"Shotgun"Ziegler">
XML元素vs.屬性
先看一個實例:
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在第一個實例中,sex是一個屬性。在第二個實例中,sex是一個元素。這兩個實例都是用來提供相同的信息的。什么時候使用屬性沒有固定的要求。在HTML中,屬性用起來很方便,但是在XML中,盡量避免使用屬性,如果信息感覺起來很像數據,盡量使用元素。
推薦方式
一下三個XML文檔中所包含的內容是完全相同的:
第一個實例中使用date屬性:
<note date="10/01/2008">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第二個實例中使用date元素:
<note>
<date>10/01/2008</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第三個實例中使用擴展的date元素(鼎力推薦):
<note>
<date>
<day>10</day>
<month>01</month>
<year>2008</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
需要避免的XML屬性
因為使用屬性而引其的一些問題:
- 屬性不能包含多個值(元素可以)
- 屬性不能包含樹結構(元素可以)
- 屬性不容易擴展(為未來的變化)
屬性難以閱讀和維護。請盡量使用元素來描述數據。
針對元數據的XML屬性
有時回想元素分配ID引用可用于標識XML元素,它起作用的方式與HTML中id屬性是一樣的。下面實例演示了這種情況:
<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屬性僅僅只是一個標識符,用于標識不同的標簽。他并不是便簽數據的組成部分。
在這里筆者想說的是:元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。
XML屬性需要遵循的規(guī)則
- 屬性名稱不能在同一起始標簽或空元素標簽中出現(xiàn)一次
- 一個屬性必須使用屬性表聲明的文檔類型定義(DTD)的聲明
- 屬性值不能包含直接或間接的實體引用外部實體
- 任何實體的替換文本成為直接或間接的屬性值中不能包含任何小于號
XML DTD
XML 驗證
DTD為英文 Document Type Definition,中文意思為 “文檔類型定義”。
擁有正確語法的XML被稱為“形勢良好”的XML。
通過DTD驗證的XML的“合法”的XML。
形式良好的XML文檔
"形式良好" 的 XML 文檔擁有正確的語法。
在前面的章節(jié)描述的語法規(guī)則:
- XML 文檔必須有一個根元素
- XML 元素都必須有一個關閉標簽
- XML 標簽對大小寫敏感
- XML 元素必須被正確的嵌套
- XML 屬性值必須加引號
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
驗證XML文檔
合法的XML文檔是 "形式良好" 的 XML 文檔,這也符合文檔類型定義(DTD)的規(guī)則:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
在上面的實踐中,DOCTYPE聲明是對外部DTD文件的引用。
XML DTD
DTD的目的是定義XML文檔的結構。他使用了一系列的合法的元素來定義文檔的結構:
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
XML驗證器
使用我們額XML驗證器來對我們的XML文件進行語法檢查
XML錯誤會終止您的程序
XML文檔中的錯誤會終止我們的XML程序。
W3C的XML規(guī)范聲明:如果XML文檔存在錯誤,那么程序就不應當繼續(xù)處理這個文件。理由是:XML軟件應當輕巧快速,具有良好的兼容。
如果使用HTML,創(chuàng)建包含大量錯誤的文檔是有可能的(比如忘記添加結束標簽),其中一個主要的原因是HTML瀏覽器相當的臃腫,兼容性也很差,并且他們有自己的方式來確定當發(fā)現(xiàn)錯誤時文檔應該顯示為什么樣子。使用XML時,這種情況不應當存在
查看XML文件
查看 XML 文件
XML文件中包含了許多元素,XML格式的信息和其他標記的基本單元,以及各種各樣的數據。查看文件顧名思義就是對XML文件進行查看。
首先在所有的主流瀏覽器中,均能查看原始的XML文件,但是不要指望XML文件會直接顯示為HTML頁面的形式。
<?xml version="1.0" encoding="ISO-8859-1"?>
- <note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body >
</note>
XML文檔將顯示為代碼顏色化的根以及元素,通過點擊元素左側的加號(+)或者減號(-),可以展開或者收起元素的結構。要查看原始的XML源(不包括 + 和 - 符號),選擇“查看頁面源代碼”或者從瀏覽器菜單中的“查看源文件”即可。
注釋:在Safari中,只有元素的文本將被顯示,要查看原始的XML,必須有機單擊頁面,選擇“查看源文件”。
XML和CSS
使用CSS來顯示XML
通過使用CSS可以顯示信息到XML文檔中
使用CSS顯示XML
使用CSS來格式化XML文檔是有可能的。
下面是關于如何使用css樣式來格式化XML文檔:
XML文件:CD目錄.
樣式表: CSS文件
最后,查看:使用CSS文件格式化CD目錄
下面是XML文件的一小部分。第二行把XML文件鏈接到CSS文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
.
.
.
</CATALOG>
使用CSS格式化XML不是常用的方法。