XML 語法速查筆記

相比起 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 範例。可以看到,一些關鍵字符比如雙引號 &quot; 是需要轉義的。</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 中有五個預定義的實體引用,在使用的時候需要 “轉義”:

字符名 字符 “轉義” 後的字符串
小於號 < &lt;
大於號 > &gt;
”and“ 符號 & &amp;
單引號 ' &apos;
雙引號 " &quot;

其中只有 <& 是確實需要特殊處理的,但是作爲規範,上述所有符號實際操作中均應處理。


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,也是本人的專欄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章