# XML ## 簡介 **可延伸標記式語言**(英語:E**x**tensible **M**arkup **L**anguage,簡稱:**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#