XML入門

1 XML簡介

什麼是XML?

  • XML 指可擴展標記語言(EXtensible Markup Language)。
  • XML 是一種標記語言。
  • XML 的設計宗旨是傳輸數據,而不是顯示數據。
  • XML 標籤沒有被預約義。您須要自行定義標籤。
  • XML 被設計爲具備自我描述性。
  • XML 是 W3C 的推薦標準。

XML不會作任何事情

XML不會作任何事情,XML被設計用來結構化、存儲以及傳輸信息。html

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面的這條便籤具備自我描述性。它包含了發送者和接受者的信息,同時擁有標題以及消息主體。
可是,這個 XML 文檔仍然沒有作任何事情。它僅僅是包裝在 XML 標籤中的純粹的信息。咱們須要編寫軟件或者程序,才能傳送、接收和顯示出這個文檔。瀏覽器

上面實例中的標籤沒有在任何 XML 標準中定義過(好比 <to> 和 <from>)。這些標籤是由 XML 文檔的創做者發明的。這是由於 XML 語言沒有預約義的標籤。less

HTML 中使用的標籤都是預約義的。HTML 文檔只能使用在 HTML 標準中定義過的標籤(如 <p>、<h1> 等等)。XML 容許創做者定義本身的標籤和本身的文檔結構。post

2 XML語法

XML文檔造成了一種樹結構,它從"根部"開始,而後擴展到"枝葉"。this

一個XML文檔實例

XML文檔使用簡單的具備自我描述性的語法:編碼

<?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 的版本(1.0)和所使用的編碼(UTF-8)。spa

下一行描述文檔的根元素(像在說:"本文檔是一個便籤"),接下來 4 行描述根的 4 個子元素(to, from, heading 以及 body)。設計

語法規則

XML 文檔必須有根元素

XML 必須包含根元素,它是全部其餘元素的父元素code

XML 聲明

XML 聲明文件的可選部分,若是存在須要放在文檔的第一行xml

<?xml version="1.0" encoding="utf-8"?>

全部的 XML 元素都必須有一個關閉標籤

在 XML 中,省略關閉標籤是非法的。全部元素都必須有關閉標籤。

note:
這個關閉標籤的一種簡寫

XML 標籤對大小寫敏感

XML 標籤對大小寫敏感。標籤 <Letter> 與標籤 <letter> 是不一樣的。必須使用相同的大小寫來編寫開始標籤和結束標籤。

XML 必須正確嵌套

XML 屬性值必須加引號

與 HTML 相似,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 元素中,會發生錯誤,這是由於解析器會把它看成新元素的開始。

在 XML 中,有 5 個預約義的實體引用:

& lt; < less than
& gt; > greater than
& amp; & ampersand
& apos; ' apostrophe
& quot; " quotation mark

XML 中的註釋

在 XML 中編寫註釋的語法與 HTML 的語法很類似。

<!-- This is a comment -->

在 XML 中,空格會被保留

XML 以 LF 存儲換行

3 XML元素

什麼是XML元素?

XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分。

一個元素能夠包含:

  • 其餘元素
  • 文本
  • 屬性
  • 或混合以上全部...

XML元素命名規則

XML 元素必須遵循如下命名規則:

  • 名稱能夠包含字母、數字以及其餘的字符
  • 名稱不能以數字或者標點符號開始
  • 名稱不能以字母 xml(或者 XML、Xml 等等)開始
  • 名稱不能包含空格

可以使用任何名稱,沒有保留的字詞。

XML元素是可擴展的

XML 的優點之一,就是能夠在不中斷應用程序的狀況下進行擴展元素。

4 XML屬性

XML元素具備屬性,相似 HTML。

屬性(Attribute)提供有關元素的額外信息,屬性一般提供不屬於數據組成部分的信息。

XML屬性值必須加引號,單引號、雙引號均可以。

<person sex="female">

屬性 VS 元素

沒有什麼規矩能夠告訴咱們何時該使用屬性,而何時該使用元素。個人經驗是在 HTML 中,屬性用起來很便利,可是在 XML 中,您應該儘可能避免使用屬性。若是信息感受起來很像數據,那麼請使用元素吧。

<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

屬性有以下限制:

  • 屬性不能包含多個值(元素能夠)
  • 屬性不能包含樹結構(元素能夠)
  • 屬性不容易擴展(爲將來的變化)

屬性難以閱讀和維護。請儘可能使用元素來描述數據,而僅僅使用屬性來提供與數據無關的信息。

針對元數據的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 屬性僅僅是一個標識符,用於標識不一樣的便籤。它並非便籤數據的組成部分。

在此咱們極力向您傳遞的理念是:元數據(有關數據的數據)應當存儲爲屬性,而數據自己應當存儲爲元素

5 XML驗證

擁有正確語法的XML被稱爲"形式良好"的XML。

有兩種方式能夠驗證XML文件:XML DTD, XML Schema。

XML錯誤會終止您的程序

XML文檔中的錯誤會終止您的 XML 應用程序。

W3C的XML規範聲明:若是XML文檔存在錯誤,那麼程序就不該當繼續處理這個文檔。理由是,XML軟件應當輕巧,快速,具備良好的兼容性。

XML DTD

DTD(文檔類型定義)的做用是定義XML文檔的合法構建模塊。

  • 經過 DTD,您的每個 XML 文件都可攜帶一個有關其自身格式的描述。
  • 經過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
  • 而您的應用程序也可以使用某個標準的 DTD 來驗證從外部接收到的數據。
  • 您還可使用 DTD 來驗證您自身的數據。

DTD 可被成行地聲明於 XML 文檔中,也可做爲一個外部引用。

內部文檔聲明

假如 DTD 被包含在您的 XML 源文件中,它應當經過下面的語法包裝在一個 DOCTYPE 聲明中:

<!DOCTYPE root-element [element-declarations]>

帶有DTD的XML文檔實例:

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

以上 DTD 解釋以下:

!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELEMENT to (第四行)定義 to 元素爲 "#PCDATA" 類型
!ELEMENT from (第五行)定義 from 元素爲 "#PCDATA" 類型
!ELEMENT heading (第六行)定義 heading 元素爲 "#PCDATA" 類型
!ELEMENT body (第七行)定義 body 元素爲 "#PCDATA" 類型

外部文檔聲明

假如 DTD 位於 XML 源文件的外部,那麼它應經過下面的語法被封裝在一個 DOCTYPE 定義中:

<!DOCTYPE root-element SYSTEM "filename">
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

這是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

note: SYSTEM表示DTD文件是私有的,PUBLIC表示DTD文件是共有的。

XML Schema

6 XML顯示

在全部主流的瀏覽器中,均可以查看原始的 XML 文件。

ML 文檔將顯示爲代碼顏色化的根以及子元素。經過點擊元素左側的加號(+)或減號( - ),能夠展開或收起元素的結構。要查看原始的 XML 源(不包括 + 和 - 符號),選擇"查看頁面源代碼"或從瀏覽器菜單"查看源文件"。

XML 文檔不會攜帶有關如何顯示數據的信息。

因爲 XML 標籤由 XML 文檔的做者"發明",瀏覽器沒法肯定像 <table> 這樣一個標籤究竟描述一個 HTML 表格仍是一個餐桌。在沒有任何有關如何顯示數據的信息的狀況下,大多數的瀏覽器都會僅僅把 XML 文檔顯示爲源代碼。

7 XML命名空間

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> 元素有不一樣的名稱。

xmlns屬性

當在 XML中使用前綴時,前綴的命名空間必須被定義。

命名空間是在元素的開始標籤的 xmlns 屬性中定義的。

命名空間聲明的語法以下。xmlns:前綴="URI"。命名空間,能夠在他們被使用的元素中或者在 XML 根元素中聲明:

<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root>

當命名空間被定義在元素的開始標籤中時,全部帶有相同前綴的子元素都會與同一個命名空間相關聯。

命名空間,能夠在他們被使用的元素中或者在 XML 根元素中聲明:
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">

<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 不會被解析器用於查找信息,其目的是賦予命名空間一個唯一的名稱

默認的命名空間

爲元素定義默認的命名空間可讓咱們省去在全部的子元素中使用前綴的工做。它的語法以下:

xmlns="namespaceURI"
這個 XML 攜帶 HTML 表格的信息:

<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
這個XML攜帶有關一件傢俱的信息:

<table xmlns="http://www.w3schools.com/furniture">
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
相關文章
相關標籤/搜索