相比起 Json,XML 是一種相對古老和複雜、但功能更加強大的數據存儲/傳輸格式。也因爲其複雜,有一些語法需要記錄一下,在使用多種語言進行 XML 操作的時候備查。
範例
下面是一個相對比較完整的 XML 範例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面這一行不屬於 XML 組成部分,但是是 XML 文檔的一部分 -->
<readme>
<author>Andrew</author>
<date>
2018-10-11
<year>2018</year>
<mon>10</mon>
<mday>11</mday>
</date>
<note>這是一個示例性質的 XML 範例。可以看到,一些關鍵字符比如雙引號 " 是需要轉義的。</note>
<main_page id="1307425">
<href><![CDATA[https://cloud.tencent.com/developer/column/4101]]></href>
<name>amc</name>
</main_page>
</readme>
以下內容主要根據上述範例進行說明。
概念和關鍵詞
- XML:可擴展標記語言(EXtensible Markup Language)
- XML 文檔:上述範例就是一個 XML 文檔
-
元素:一個
<xxx>...</xxx>
對及其中間的部分加起來,就是一個元素 -
XML 標籤(Tags):範例中的
<xxx>
和</xxx>
文字就是一對標籤 - 根元素:每個 XML 文檔需要有且只有一個根元素,這個元素是所有元素的祖先元素
-
子元素(Children)、同胞元素(Siblings):範例中
<date>
元素下的<year>
、<mon>
、<mday>
元素就是子元素,這幾個子元素之間互爲同胞元素 -
文本內容(Text):範例中,
<author>
元素中的Andrew
就是文本內容;同理<date>
元素下的2018-10-11
也是文本內容 -
屬性(Attributes):範例中
main_page
元素中有一段文字id="1307425"
,這就是元素main_page
的屬性,其屬性名爲 "id",屬性值 爲 “1307425”。
語法規則速查
- 所有 XML 元素均需要有關閉標籤,比如
<name>
均必須跟着一個</name>
結尾 - XML 標籤大小寫敏感
- XML 必須正確地嵌套
- XML 必須有且只有一個根元素
- 屬性值必須加上引號,至於屬性名則無需引號。
XML 元素命名規則
強制性的命名規則如下:
- 元素命名只包含文字(包括非英文的文字)、數字、字符
- 不能以 “XML” 或其他大寫轉換後爲 “XML” 的字符串開頭
- 不能包含空格
約定俗成(建議)的命名規則,除了上述幾條之外,還有:
- 不要使用減號/連字符 “
-
”,建議使用下劃線 “_
” - 避免使用點 “
.
” 和冒號 “:
” - 不要使用非
ascii
字符
屬性
建議避免使用屬性,而是以子元素 + 文本內容的方式來替代。比如:
<date>2018-10-11</date>
建議替換成範例中的:
<date>
2018-10-11<!--可加可不加,加上可以作爲對老代碼的兼容-->
<year>2018</year>
<mon>10</mon>
<mday>11</mday>
</date>
“轉義”
這裏借用了 C/C++ 裏格式化字符串的 “轉義” 一詞,但是實際上 XML 沒有這個名詞,而是 “實體引用”。XML 中有五個預定義的實體引用,在使用的時候需要 “轉義”:
字符名 | 字符 | “轉義” 後的字符串 |
---|---|---|
小於號 | < |
< |
大於號 | > |
> |
”and“ 符號 | & |
& |
單引號 | ' |
' |
雙引號 | " |
" |
其中只有 <
和 &
是確實需要特殊處理的,但是作爲規範,上述所有符號實際操作中均應處理。
XML CDATA
XML CDATA
是一個關鍵字,其包含的內容不會被 XML 解析器解析。CDATA 採用 <![CDATA
開頭,用 ]]>
結尾。比如範例中的:
<href><![CDATA[https://cloud.tencent.com/developer/column/4101]]></href>
注意不同語言或庫對 CDATA 的解析方式可能會有所不同,比如 Python 解析 CDATA 後會得到一個普通的 text 值,但是 RapidXML 則會得到一個子元素。
CDATA 也有限制,就是正文中不能包含 ]]>
,否則會導致解析錯誤。
XML 命名空間
這個功能目前筆者覺得比較少用,不過還是記錄一下。命名空間約定使用冒號進行分分隔。命名空間可以手動指定,如:
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
實操中,推薦加上命名空間屬性 xmlns
,如:
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
參考資料
本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。
本文地址:https://segmentfault.com/a/1190000016649785
原文發佈於:https://cloud.tencent.com/developer/article/1351914,也是本人的專欄。