XML

簡介

可延伸標記式語言(英語:Extensible Markup Language,簡稱:XML)是一種標記式語言。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。如何定義這些標記,既可以選擇國際通用的標記式語言,例如HTML,也可以使用像XML這樣由相關人士自由決定的標記式語言,這就是語言的可延伸性。XML是從標準通用標記式語言(SGML)中簡化修改出來的。它主要用到的有可延伸標記式語言、可延伸樣式語言(XSL)、XBRL和XPath等。

用途

XML設計用來傳送及攜帶資料資訊,不用來表現或展示資料,HTML則用來表現資料,所以XML用途的焦點是它說明資料是什麼,以及攜帶資料資訊。

  • 富文件(Rich Documents)- 自訂檔案描述並使其更豐富
    • 屬於檔案為主的XML技術應用
    • 標記是用來定義一份資料應該如何呈現
  • 元資料(Metadata)- 描述其它檔案或網路資訊
    • 屬於資料為主的XML技術應用
    • 標記是用來說明一份資料的意義
  • 組態文件(Configuration Files)- 描述軟體設定的參數

重要術語

字元(characters)

XML 1.0規範允許的(跳脫後的最終解碼值)合法字元: #x9(水平制表符)、#xA(回車字元)、#xD(換行符)、#x20-#xD7FF、#xE000-#xFFFD、#x10000-#x10FFFF。即任何Unicode字元,不包含surrogate blocks, FFFE, FFFF。

XML規範定義了5個"預定義實體"來表示特殊字元. XML也允許在每個文件定義任意數量的其它命名實體.

下表列出了5個XML預定義實體. 通過名字參照這些實體的格式為&name;,例如, & 將繪製為&.

名字 字元 Unicode碼位(十進位) 標準 描述
quot " U+0022 (34) XML 1.0 雙引號
amp & U+0026 (38) XML 1.0 &
apos ' U+0027 (39) XML 1.0 單引號
lt < U+003C (60) XML 1.0 小於
gt > U+003E (62) XML 1.0 大於

處理器(Processor)與應用(application)

XML處理器(Processor,也稱作XML parser)分析標記式語言並傳遞結構化資訊給應用(application)。

標記(Markup)與內容(content)

XML文件的字元分為標記(Markup)與內容(content)兩類。標記通常以<開頭,以>結尾;或者以字元& 開頭,以;結尾。不是標記的字元就是內容。但是CDATA部分,分解符號<![CDATA[]]>是標記,二者之間的文字為內容。 最外界的空白符是標記。

標籤(Tag)

一個tag屬於標記結構,以<開頭,以>結尾。Tag名字是大小寫敏感,不能包括任何字元 !"#$%&'()*+,/;<=>?@[]^`~, 也不能有空格符, 不能以"-"或"."或數字開始。可分為三類:

元素(Element)

元素是文件邏輯組成,或者在start-tag與匹配的end-tag之間,或者僅作為一個empty-element tag。例如:<greeting>Hello, world!</greeting>. 另一個例子是: <line-break />.

單個根(root)元素包含所有的其他元素。

屬性(Attribute)

屬性是一種標記結構,在start-tag或empty-element tag內部的「名字-值對」。例如:<img src="madonna.jpg" alt="Madonna" />。每個元素中,一個屬性最多出現一次,一個屬性只能有一個值。

如果屬性有多個值,這需要採取XML協定以外的方式來表示,如採用逗號或分號間隔,對於CSS類或識別碼的名字可用空格來分隔。

XML 聲明(declaration)

XML文件如果以XML declaration開始,則表述了文件的一些資訊。如<?xml version="1.0" encoding="UTF-8"?>.

範例

XML定義結構、儲存資訊、傳送資訊。下例為小張傳送給大元的便條,儲存為XML。

<?xml version="1.0"?>
  <小紙條>
    <收件人>大元</收件人>
    <發件人>小張</發件人>
    <主題>問候</主題>
    <具體內容>早啊,飯吃了沒? </具體內容>
  </小纸條>

這XML文件僅是純粹的資訊標籤,這些標籤意義的展開依賴於應用它的程式。

結構

每個XML文件都由XML聲明開始,在前面的代碼中的第一行就是XML聲明,<?xml version="1.0"?>。這一行代碼會告訴解析器或瀏覽器這個檔案應該按照XML規則進行解析。

但是,根元素到底叫<小紙條>還是<小便條>,則是由「文件類型定義(DTD)」或「XML綱要(XML Schema)」定義的。如果DTD規定根元素必須叫<小便條>,那麼若寫作<小紙條>就不符合要求。這種不符合DTD或XML綱要的要求的XML文件,被稱作不合法的XML,反之則是合法的XML

XML檔案的第二行並不一定要包含文件元素;如果有注釋或者其他內容,文件元素可以遲些出現。

最常見的PI(processing instruction,像XML序言, 卻是不同類型的語法)是用來指定XML檔案的樣式表, 這個PI一般會直接放在XML序言之後,通常由Web瀏覽器使用,來將XML資料以特殊的樣式顯示出來。

XML的結構有一個缺陷,那就是不支援分影格(framing)。當多條XML訊息在TCP上傳輸的時候,無法基於XML協定來確定一條XML訊息是否已經結束。

Python解析XML

與HTML一樣,可以使用Beautifulsoup來解析XML文件,然後萃取出需要的資訊。

補充:

官方承認內建的ElementTree解析XML存在漏洞:https://docs.python.org/3/library/xml.etree.elementtree.html#