XMl語言
簡介
XML又叫做可擴展標記語言。它和HTML語言一樣是標記語言,且結構基本一致,然后他們之間也有很多不同的地方:
- XML主要用於數據的傳輸和儲存;HTML主要用於數據的顯示
- XMl是沒有被預定義標簽,需要自行定義標簽;HTML是被預定義了的標簽
- XML都是雙標簽;HTML有單標簽
- XMl對大小寫敏感;HTML對大小寫不敏感
- XML會保留所有的空格;HTML只會留下一個空格
基本結構
XML是一種樹結構,它從根部開始不斷的向外延伸:

其具體的文檔形式如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<name>Mingle</name>
<age>18</age>
<hometown>MeiShan</hometown>
</note>
其中,<?xml version="1.0" encoding="ISO-8859-1"?>是對XML的聲明,定義 XML 的版本 (1.0) 和所使用的編碼 (ISO-8859-1 = Latin-1/西歐字符集)。下一行的<note>標簽就是根元素的開始,每一個標簽的名字是可以任意取得,只要在其他地方有意義就行了。
實體引用和注釋
在HTML中,一些字符擁有特殊的意義,為了避免出現錯誤,我們需要借助實體引用來實現,以下是XML中的5個預定義的實體引用:
| 預定義 | 含義 |
|---|---|
< |
< |
> |
> |
& |
& |
' |
' |
" |
" |
XML中的注釋和HTML語法一樣,即<!--comment-->
元素內容
元素內容在XMl里面很常見,如<name lang="English">Minlge</name>,其中name就是元素內容,Mingle是文本內容。
XML元素命令有以下規則:
- 名稱可以含字母、數字以及其他的字符
- 名稱不能以數字或者標點符號開始
- 名稱不能以字符 “xml”(或者 XML、Xml)開始
- 名稱不能包含空格
另外,我們要盡量避免在命名的過程中使用"-"、"."和":"這些字符。
屬性
XML的屬性就是在元素內容中的附加內容,如上面例子中的lang="English"就叫做屬性。屬性必須被引號包圍,單引號和雙引號都可以使用,不過當屬性內容里面有雙引號的時候,我們可以用單引號包圍屬性或者在里面使用實體引用,如下:
<gangster name='George "Shotgun" Ziegler'>
<gangster name="George "Shotgun" Ziegler">
因為XML屬性有以下缺點:
- 屬性無法包含多重的值(元素可以)
- 屬性無法描述樹結構(元素可以)
- 屬性不易擴展(為未來的變化)
- 屬性難以閱讀和維護
所以,我們並不建議盲目地使用元素,不過如果我們要給元素內容添加標識的話,可以使用。
XPath
選取節點
XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和我們在常規的電腦文件系統中看到的表達式非常相似。
| 表達式 | 描述 |
|---|---|
| nodename | 選取此節點的所有子節點 |
| / | 從根節點選取 |
| // | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置 |
| . | 選取當前節點 |
| .. | 選取當前節點的父節點 |
| @ | 選取屬性 |
謂語
在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:
| 路徑表達式 | 結果 |
|---|---|
| /bookstore/book[1] | 選取屬於 bookstore 子元素的第一個 book 元素 |
| /bookstore/book[last()] | 選取屬於 bookstore 子元素的最后一個 book 元素 |
| /bookstore/book[last()-1] | 選取屬於 bookstore 子元素的倒數第二個 book 元素 |
| /bookstore/book[position()❤️] | 選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素 |
| //title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素 |
| //title[@lang='eng'] | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性 |
| /bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00 |
| /bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00 |
選取未知節點
XPath 通配符可用來選取未知的 XML 元素
| 通配符 | 描述 |
|---|---|
| * | 匹配任何元素節點 |
| @* | 匹配任何屬性節點 |
| node() | 匹配任何類型的節點 |
選取若干路徑
通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
| 路徑表達式 | 結果 |
|---|---|
| //book/titleΙ//book/price | 選取 book 元素的所有 title 和 price 元素 |
| //titleΙ//price | 選取文檔中的所有 title和price元素 |
| /bookstore/book/titleΙ//price | 選取屬於bookstore元素的book元素的所有title元素,以及文檔中所有的price元素 |
XPath軸
軸可定義相對於當前節點的節點集。
| 軸名稱 | 結果 |
|---|---|
| ancestor | 選取當前節點的所有先輩(父、祖父等) |
| ancestor-or-self | 選取當前節點的所有先輩(父、祖父等)以及當前節點本身 |
| attribute | 選取當前節點的所有屬性 |
| child | 選取當前節點的所有子元素 |
| descendant | 選取當前節點的所有后代元素(子、孫等) |
| descendant-or-self | 選取當前節點的所有后代元素(子、孫等)以及當前節點本身 |
| following | 選取文檔中當前節點的結束標簽之后的所有節點 |
| namespace | 選取當前節點的所有命名空間節點 |
| parent | 選取當前節點的父節點 |
| preceding | 選取文檔中當前節點的開始標簽之前的所有節點 |
| preceding-sibling | 選取當前節點之前的所有同級節點 |
| self | 選取當前節點 |
位置路徑表達式
位置路徑可以是絕對的,也可以是相對的。絕對路徑起始於正斜杠(/),而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割:
絕對位置路徑:
/step/step/...
相對位置路徑:
step/step/...
步的語法:
軸名稱::節點測試[謂語]
實例
| 例子 | 結果 |
|---|---|
| child::book | 選取所有屬於當前節點的子元素的 book 節點 |
| attribute::lang | 選取當前節點的 lang 屬性 |
| child:😗 | 選取當前節點的所有子元素 |
| attribute:😗 | 選取當前節點的所有屬性 |
| child::text() | 選取當前節點的所有文本子節點 |
| child::node() | 選取當前節點的所有子節點 |
| descendant::book | 選取當前節點的所有 book 后代 |
| ancestor::book | 選擇當前節點的所有 book 先輩 |
| ancestor-or-self::book | 選取當前節點的所有 book 先輩以及當前節點(如果此節點是 book 節點) |
| child:😗/child::price | 選取當前節點的所有 price 孫節點 |
XPath運算符
| 運算符 | 描述 |
|---|---|
| Ι | 計算兩個節點集 |
| + | 加法 |
| - | 減法 |
| * | 乘法 |
| div | 除法 |
| = | 等於 |
| != | 不等於 |
| < | 小於 |
| <= | 小於或等於 |
| > | 大於 |
| >= | 大於或等於 |
| or | 或 |
| and | 與 |
| mod | 計算除法的余數 |
