XML 是一種用於存儲和傳輸數據的與軟體和硬體無關的工具。 什麼是XML? XML代表eXtensible Markup Language(可擴展標記語言)。XML是一種與HTML非常相似的標記語言。XML被設計用於存儲和傳輸數據。XML被設計成具有自我描述性。XML不執行任何操作,也許有點難理解, ...
XML 是一種用於存儲和傳輸數據的與軟體和硬體無關的工具。
什麼是XML?
XML代表eXtensible Markup Language(可擴展標記語言)
。XML是一種與HTML非常相似的標記語言。XML被設計用於存儲和傳輸數據。XML被設計成具有自我描述性。XML不執行任何操作,也許有點難理解,但XML不執行任何操作。
XML示例
這是一張存儲為XML的給Tove的Jani的便簽:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面的XML相當自我描述:
- 它包含了發件人信息
- 它包含了收件人信息
- 它有一個標題
- 它有一個消息正文
但是,上面的XML仍然不執行任何操作。XML只是用標記包裝的信息。
必須有人編寫一段軟體來發送、接收、存儲或顯示它:
Note
To: Tove
From: Jani
Reminder
Don't forget me this weekend!
XML和HTML的區別
XML和HTML是出於不同目的而設計的:
- XML被設計用於攜帶數據 - 專註於數據是什麼
- HTML被設計用於顯示數據 - 專註於數據的呈現方式
XML標簽不像HTML標簽那樣是預定義的。XML語言沒有預定義的標簽。上面示例中的標簽(如<to>
和<from>
)在任何XML標準中都未定義。這些標簽是XML文檔的作者“創造”的。
HTML使用預定義標簽,如<p>
、<h1>
、<table>
等。使用XML,作者必須定義標簽和文檔結構。
XML是可擴展的
大多數XML應用程式即使添加(或刪除)新數據也能正常工作。
想象一個應用程式,設計用於顯示note.xml
的原始版本(<to>
<from>
<heading>
<body>
)。然後想象一個具有添加的<date>
和<hour>
元素以及刪除<heading>
的新版本的note.xml
。
XML構造的方式使得舊版本的應用程式仍然可以工作:
<note>
<date>2015-09-01</date>
<hour>08:30</hour>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
舊版本
Note
To: Tove
From: Jani
Reminder
Don't forget me this weekend!
新版本
Note
To: Tove
From: Jani
Date: 2015-09-01 08:30
Don't forget me this weekend!
XML簡化事務
- XML簡化數據共用
- XML簡化數據傳輸
- XML簡化平臺更改
- XML簡化數據可用性
許多電腦系統包含以不相容格式存儲的數據。在不相容的系統(或升級的系統)之間交換數據對於Web開發人員來說是一項耗時的任務。必須轉換大量數據,並且通常會丟失不相容的數據。
XML以純文本格式存儲數據。這提供了一種與軟體和硬體無關的存儲、傳輸和共用數據的方式。
XML還使得擴展或升級到新的操作系統、新的應用程式或新的瀏覽器變得更容易,而不會丟失數據。
使用XML,數據可以供各種“閱讀機器”使用,如人類、電腦、語音機器、新聞源等。
XML的用途
XML在Web開發的許多方面都得到了應用。
XML分離數據與演示
XML通常用於將數據與演示分離。XML不包含有關如何顯示的任何信息。相同的XML數據可以在許多不同的演示情境中使用。因此,使用XML,數據和演示之間存在完全的分離。
XML通常與HTML搭配使用
在許多HTML應用程式中,XML用於存儲或傳輸數據,而HTML用於格式化和顯示相同的數據。
XML分離數據與HTML
在HTML中顯示數據時,當數據發生變化時不應該修改HTML文件。使用XML,數據可以存儲在單獨的XML文件中。通過幾行JavaScript代碼,您可以讀取一個XML文件並更新任何HTML頁面的數據內容。
Books.xml
示例:
<?xml version="1.0" encoding="UTF-8"?>
<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">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
事務數據
存在成千上萬種XML格式,用於描述不同行業的日常數據交易:
- 股票和股份
- 金融交易
- 醫療數據
- 數學數據
- 科學測量
- 新聞信息
- 天氣服務
示例 XML
XMLNews是用於交換新聞和其他信息的規範。使用標準使得新聞製作者和新聞消費者更容易在不同的硬體、軟體和編程語言之間產生、接收和存檔任何類型的新聞信息。
一個示例XMLNews文檔:
<?xml version="1.0" encoding="UTF-8"?>
<nitf>
<head>
<title>Colombia Earthquake</title>
</head>
<body>
<headline>
<hl1>143 Dead in Colombia Earthquake</hl1>
</headline>
<byline>
<bytag>By Jared Kotler, Associated Press Writer</bytag>
</byline>
<dateline>
<location>Bogota, Colombia</location>
<date>Monday January 25 1999 7:28 ET</date>
</dateline>
</body>
</nitf>
示例 XML 天氣服務
來自美國國家海洋和大氣管理局(NOAA)的XML國家氣象服務:
<?xml version="1.0" encoding="UTF-8"?>
<current_observation>
<credit>NOAA's National Weather Service</credit>
<credit_URL>http://weather.gov/</credit_URL>
<image>
<url>http://weather.gov/images/xml_logo.gif</url>
<title>NOAA's National Weather Service</title>
<link>http://weather.gov</link>
</image>
<location>New York/John F. Kennedy Intl Airport, NY</location>
<station_id>KJFK</station_id>
<latitude>40.66</latitude>
<longitude>-73.78</longitude>
<observation_time_rfc822>Mon, 11 Feb 2008 06:51:00 -0500 EST
</observation_time_rfc822>
<weather>A Few Clouds</weather>
<temp_f>11</temp_f>
<temp_c>-12</temp_c>
<relative_humidity>36</relative_humidity>
<wind_dir>West</wind_dir>
<wind_degrees>280</wind_degrees>
<wind_mph>18.4</wind_mph>
<wind_gust_mph>29</wind_gust_mph>
<pressure_mb>1023.6</pressure_mb>
<pressure_in>30.23</pressure_in>
<dewpoint_f>-11</dewpoint_f>
<dewpoint_c>-24</dewpoint_c>
<windchill_f>-7</windchill_f>
<windchill_c>-22</windchill_c>
<visibility_mi>10.00</visibility_mi>
<icon_url_base>http://weather.gov/weather/images/fcicons/</icon_url_base>
<icon_url_name>nfew.jpg</icon_url_name>
<disclaimer_url>http://weather.gov/disclaimer.html</disclaimer_url>
<copyright_url>http://weather.gov/disclaimer.html</copyright_url>
</current_observation>
XML樹
XML文檔形成了一棵樹狀結構,從“根”開始分支到“葉子”。
XML樹結構
DOM節點樹
一個XML文檔可以被看作是一棵樹,這被稱為DOM(Document Object Model)節點樹
。DOM節點樹以根節點為起點,分支到各個子節點,形成一個層級結構。
一個XML文檔的示例
上圖表示了XML中的圖書:
<?xml version="1.0" encoding="UTF-8"?>
<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>
XML樹結構
XML文檔被形成為元素樹。
XML樹始於根元素,從根元素分支到子元素。
所有元素都可以有子元素(子元素):
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
術語父元素、子元素和兄弟元素用於描述元素之間的關係。
- 父元素有子元素。
- 子元素有父元素。
- 兄弟元素是在同一級別上的子元素(兄弟姐妹)。
所有元素都可以有文本內容(例如:Harry Potter)和屬性(例如:category="cooking")。
自描述語法
XML使用了一種非常自描述的語法。
一個前導定義了XML版本和字元編碼:
<?xml version="1.0" encoding="UTF-8"?>
下一行是文檔的根元素:
<bookstore>
下一行開始了一個<book>
元素:
<book category="cooking">
<book>
元素有4個子元素:<title>
、<author>
、<year>
、<price>
。
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
下一行結束了<book>
元素:
</book>
從這個例子中,您可以假設XML文檔包含了有關書店中書籍的信息。
XML語法規則
XML的語法規則非常簡單和邏輯。這些規則易於學習和使用。
XML文檔必須有一個根元素
XML文檔必須包含一個作為所有其他元素的父元素的根元素:
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
在這個例子中,<note>
是根元素:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML前導部分
這一行被稱為XML前導部分:
<?xml version="1.0" encoding="UTF-8"?>
XML前導部分是可選的。如果存在,它必須在文檔中首先出現。
所有XML元素必須有一個結束標簽
在XML中,省略結束標簽是非法的。所有元素必須有一個結束標簽:
<p>This is a paragraph.</p>
<br />
XML標簽區分大小寫
XML標簽是區分大小寫的。標簽<Letter>
與標簽<letter>
是不同的。
開放和關閉標簽必須使用相同的大小寫
<message>This is correct</message>
“開放和關閉標簽”通常被稱為“開始和結束標簽”。
XML元素必須嵌套正確
在XML中,所有元素必須在彼此之內正確嵌套:
<b><i>This text is bold and italic</i></b>
XML屬性值必須始終用引號括起來
XML元素可以具有類似HTML中的名稱/值對的屬性。在XML中,屬性值必須始終用引號括起來:
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
實體引用
在XML中,一些字元具有特殊的含義。為了避免解釋錯誤,需要使用實體引用:
<message>salary < 1000</message>
XML中的註釋
在XML中編寫註釋的語法與HTML類似:
<!-- This is a comment -->
在XML中保留空白
XML不截斷多個空白,保留所有空白字元。
XML將新行存儲為LF
XML將新行存儲為LF(Line Feed)。
格式良好的XML
符合上述語法規則的XML文檔被稱為“格式良好”的XML文檔。
XML元素
一個XML文檔包含XML元素。
什麼是XML元素?
一個XML元素是從(包括)元素的開始標簽到(包括)元素的結束標簽的所有內容。
<price>29.99</price>
一個元素可以包含:
- 文本
- 屬性
- 其他元素
- 或以上的混合
<bookstore>
<book category="children">
<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>
在上面的例子中:
<title>
、<author>
、<year>
和<price>
具有文本內容,因為它們包含文本(如29.99)。<bookstore>
和<book>
具有元素內容,因為它們包含元素。<book>
具有一個屬性(category="children"
)。
空XML元素
沒有內容的元素被稱為空元素。
在XML中,可以這樣表示一個空元素:
<element></element>
也可以使用所謂的自閉合標簽:
<element />
這兩種形式在XML軟體(閱讀器、解析器、瀏覽器)中產生相同的結果。
空元素可以有屬性。
XML命名規則
XML元素必須遵循以下命名規則:
- 元素名稱區分大小寫
- 元素名稱必須以字母或下劃線開頭
- 元素名稱不能以字母xml(或XML、Xml等)開頭
- 元素名稱可以包含字母、數字、連字元、下劃線和句點
- 元素名稱不能包含空格
除了xml,任何名稱都可以使用,沒有保留的單詞(除了xml)。
最佳命名實踐
- 創建描述性的名稱,比如:
<person>
、<firstname>
、<lastname>
。 - 創建簡短和簡單的名稱,比如:
<book_title>
而不是<the_title_of_the_book>
。
命名約定
一些常用的XML元素命名約定:
- 小寫:
<firstname>
(所有字母都小寫) - 大寫:
<FIRSTNAME>
(所有字母都大寫) - 蛇形命名:
<first_name>
(下劃線分隔單詞,常用於SQL資料庫) - 帕斯卡命名:
<FirstName>
(每個單詞的首字母大寫,C程式員常用) - 駱駝命名:
<firstName>
(每個單詞的首字母大寫,除了第一個,JavaScript中常用)
提示! 選擇您的命名風格,並始終保持一致!
XML元素是可擴展的
XML元素可以擴展以攜帶更多的信息。
看下麵的XML示例:
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
假設我們創建了一個應用程式,從XML文檔中提取<to>
、<from>
和<body>
元素以生成以下輸出:
MESSAGE
To: Tove
From: Jani
Don't forget me this weekend!
想象一下,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的優點之一。它可以在不破壞應用程式的情況下進行擴展。
XML屬性
XML元素可以有屬性,就像HTML一樣。
XML屬性必須用引號括起來
屬性值必須始終用引號括起來。可以使用單引號或雙引號。
對於一個人的性別,<person>
元素可以這樣寫:
<person gender="female">
或者像這樣:
<person gender='female'>
如果屬性值本身包含雙引號,可以使用單引號,就像在這個例子中:
<gangster name='George "Shotgun" Ziegler'>
或者可以使用字元實體:
<gangster name="George "Shotgun" Ziegler">
XML元素 vs 屬性
在XML中,沒有規定何時使用屬性或何時使用元素的規則。
我最喜歡的方式
以下三個XML文檔包含完全相同的信息:
在第一個例子中使用了一個date屬性:
<note date="2008-01-10">
<to>Tove</to>
<from>Jani</from>
</note>
在第二個例子中使用了一個<date>
元素:
<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
</note>
在第三個例子中使用了一個擴展的<date>
元素:(這是我最喜歡的)
<note>
<date>
<year>2008</year>
<month>01</month>
<day>10</day>
</date>
<to>Tove</to>
<from>Jani</from>
</note>
避免使用XML屬性?
在使用屬性時要考慮的一些事項有:
- 屬性不能包含多個值(元素可以)
- 屬性不能包含樹結構(元素可以)
- 屬性不容易擴展(以適應將來的更改)
不要陷入這種情況:
<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
用於元數據的XML屬性
有時會為元素分配ID引用。這些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命名空間
XML命名空間提供了一種避免元素名稱衝突的方法。
名稱衝突
在XML中,元素名稱由開發人員定義。這通常導致在嘗試混合來自不同XML應用程式的XML文檔時發生衝突。
這個XML包含HTML表信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
這個XML包含有關桌子(傢具的一部分)的信息:
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
如果將這些XML片段相加,將會出現名稱衝突。兩者都包含一個<table>
元素,但這些元素具有不同的內容和含義。
用戶或XML應用程式將不知道如何處理這些差異。
使用首碼解決名稱衝突
在XML中,可以通過使用名稱首碼輕鬆避免名稱衝突。
這個XML包含有關HTML表和傢具的信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在上面的例子中,不會發生衝突,因為這兩個<table>
元素具有不同的名稱。
XML命名空間 - xmlns屬性
在XML中使用首碼時,必須為首碼定義一個命名空間。可以通過元素的開始標記中的xmlns屬性來定義命名空間。
命名空間聲明具有以下語法:xmlns:prefix="URI"。
<root>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
在上面的例子中:
- 第一個
<table>
元素中的xmlns屬性為h:首碼提供了一個合格的命名空間。 - 第二個
<table>
元素中的xmlns屬性為f:首碼提供了一個合格的命名空間。
當為元素定義命名空間時,所有具有相同首碼的子元素都與相同的命名空間相關聯。
命名空間也可以在XML根元素中聲明:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
註意: 解析器不使用命名空間URI查找信息。使用URI的目的是為命名空間提供一個唯一的名稱。然而,公司通常將命名空間用作指向包含命名空間信息的網頁的指針。
統一資源標識符(URI)
統一資源標識符(URI)是一個字元串,用於標識互聯網資源。最常見的URI是統一資源定位符(URL),用於標識互聯網域地址。另一種不太常見的URI類型是統一資源名稱(URN)。
預設命名空間
為元素定義預設命名空間可以避免在所有子元素中使用首碼。它具有以下語法:xmlns="namespaceURI"。
這個XML包含HTML表信息:
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
這個XML包含有關傢具的信息:
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
實際使用中的命名空間
XSLT是一種可用於將XML文檔轉換為其他格式的語言。
下麵的XML文檔是用於將XML轉換為HTML的文檔。
命名空間"http://www.w3.org/1999/XSL/Transform"標識HTML文檔中的XSLT元素:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
最後
為了方便其他設備和平臺的小伙伴觀看往期文章:
微信公眾號搜索:Let us Coding
,關註後即可獲取最新文章推送
看完如果覺得有幫助,歡迎點贊、收藏、關註