跳至內容

XML

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
XML (標準)
可延伸標記式語言
狀態已發佈, 萬維網聯盟
開始年1996
首次出版1998年2月10日,​26年前​(1998-02-10
最新版本1.1 (第二版)
2006年9月29日,​18年前​(2006-09-29
組織萬維網聯盟
編輯Tim Bray, Jean Paoli, Michael Sperberg-McQueen, Eve Maler, François Yergeau, John W. Cowan
基礎標準SGML
有關標準XML_Schema
領域序列化
縮寫XML
網站www.w3.org/xml
XML (檔案格式)
副檔名
.xml
網路媒體型式
application/xml, text/xml
統一類型標識public.xml
UTI結構public.text
開發者萬維網聯盟
格式類型標記式語言
延伸自SGML
延伸為XHTML, RSS, Atom, KML 等等
標準1.0, 第五版 (2008年11月26日 (2008-11-26)) 1.1, 第二版 (2006年8月16日 (2006-08-16))
自由格式
免費格式?

可延伸標記式語言(英語:Extensible Markup Language,簡稱:XML)是一種標記式語言和用於儲存、傳輸和重構鬆散數據的檔案格式。它定義了一系列編碼文件的規則以使其在人類可讀的同時機器可讀萬維網聯盟於1998年[1]發佈的 XML 1.0 規範[2]和其他相關[3]開源標準共同定義了 XML[4]

XML 的設計目標是注重簡潔、通用和互聯網可用性[5]。它是一種通過 Unicode 編碼實現對多種語言有強大支援的文字數據格式。儘管 XML 的設計重心在於文件,它被廣泛應用於網絡服務中鬆散數據結構的表示。[6]

總覽

[編輯]

XML 的主要目的是序列化(如儲存、傳輸和重構鬆散數據)。對於兩個需要傳輸資訊的不同系統,它們也需要在檔案格式上達成一致。XML 規範了這個流程,因此其類似於用於表示資訊的通用語言[7]

作為一個標記式語言,XML 標記,分類和在結構方面組織數據。[7]XML 標籤代表結構且包含元數據,標籤內是照 XML 標準編碼的數據。[7]一個附加的 XML 結構(XSD)定義了用於解釋和驗證 XML 的必要的元數據(這也被稱為結構典範)[7]。一個符合 XML 基本語法的文件是「結構良好」的(well-formed),一個符合其附加結構的是「有效」(valid)的。[7]

互聯網工程任務組RFC 7303(取代了舊的 RFC 3023)提供了用於構造 XML 中媒體類型的規則。它定義了三種媒體類型:

application/xml                             (text/xml是一个别名)
application/xml-external-parsed-entity      (text/xml-external-parsed-entity是一个别名)
application/xml-dtd

它們被用於在不暴露內容的同時傳輸未經處理的 XML 檔案。RFC 7303 還建議基於 XML 的語言的媒體類型應以 +xml 結尾(如 SVG 的 image/svg+xml)。

對於 XML 在網絡中的進一步使用指南於 RFC 3470 (也被稱為 IETF BCP 70,包含設計部署基於 XML 的語言的各個方面)提出。

應用

[編輯]
SVG代碼範例

XML 在互聯網資訊交換中已經被廣泛應用。數以百計使用 XML 語法的文件格式(包括 RSSAtomOffice Open XMLOpenDocumentSVGCOLLADAXHTML)被開發出來[8]。XML 還為多種通訊協定(如 SOAPXMPP)提供了基礎語言。它還是AJAX使用的資訊交換格式之一。

許多工業數據標準,如Health Level 7OpenTravel AllianceFpMLMISMONational Information Exchange Model,基於 XML 和 XML 附加結構豐富的特性。在出版領域,Darwin Information Typing Architecture 是一個 XML 行業數據標準。XML 被廣泛應用與支援各種出版格式。

關鍵術語

[編輯]

該部分內容基於 XML 規範。注意這並不是一個詳盡的列出所有結構的列表,而是提供 XML 中常見組成的介紹。

字元( Character )

[編輯]

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)。

XML 規範規定了處理器要做什麼不能做什麼,但是應用並不在其討論範圍內。規範稱之為處理器的東西一般被通俗的稱為 XML 解析器

標記( Markup )與內容( Content )

[編輯]

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

標籤( Tag )

[編輯]

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

  • 起始標籤 start-tag,如<section>;
  • 結束標籤 end-tag,如</section>;
  • 空白標籤 empty-element tag,如<line-break />.

元素( Element )

[編輯]

元素是文件邏輯組件,它在起始標籤與匹配的結束標籤之間,或者僅由一個空白標籤組成。例如:<greeting>Hello, world!</greeting>. 另一個例子是: <line-break />.在標籤間的內容可以包含其他元素(稱為子元素)

屬性( Attribute )

[編輯]

屬性是由名稱-值對組成的標記結構,存在於開始標籤或空元素標籤內。例如,<img src="madonna.jpg" alt="Madonna" />中,屬性的名稱是 "src" 和 "alt",它們的值分別是 "madonna.jpg" 和 "Madonna"。另一個例子是<step number="3">Connect A to B.</step>,其中屬性的名稱是 "number",其值是 "3"。XML 屬性只能有一個值,每個屬性在每個元素上最多只能出現一次。在常見情況下,如果需要包含多個值的列表,則必須通過將列表編碼為符合良構性的 XML 屬性,其格式超出了 XML 本身的定義。通常,這可以是以逗號或分號分隔的列表,或者如果已知各個值不包含空格[ii],則可以使用以空格分隔的列表。例如,<div class="inner greeting-box">Welcome!</div>中,屬性 "class" 的值是 "inner greeting-box",同時表示兩個 CSS 類名 "inner" 和 "greeting-box"。

XML 聲明( Declaration )

[編輯]

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

字元與跳脫

[編輯]

XML 文件完全由 Unicode 字元庫中的字元組成。 除了少數特殊排除的控制字元外,Unicode 定義的任何字元都可以出現在 XML 文件的內容中。

XML 包含用於辨識構成文件的 Unicode 字元編碼的工具,以及用於表達由於某種原因不能直接使用的字元的工具。

有效字元

[編輯]

以下範圍內的Unicode字碼在 XML 1.0 文件中是有效的:[9]

  • U+0009 ( 水平制表符 ), U+000A ( 換行 ), U+000D ( Enter ): 這些是在 XML 1.0 中唯一接受的控制字元
  • U+0020 - U+D7FF, U+E000 - U+FFFD: 這些排除了BMP中的一些非字元(所有代理項,U+FFFE和U+FFFF是不被允許的)
  • U+10000 - U+10FFFF: 這些包含所有在增補計劃中的字碼,包含非字元

XML 1.1 擴充了允許的字元集以包含上述內容和U+0001 - U+001F[10],但同時,它限制使用 U+0009( 水平制表符 )、U+000A( 換行 )、U+000D( Enter )和 U+0085(下一行)以外的 C0 和 C1 控制字元 ),要求它們以跳脫形式編寫(例如 U+0001 必須寫為 &#x01; 或其等效形式)。 對於 C1 字元,此限制是向後不相容; 引入它是為了檢測常見的編碼錯誤。

U+0000 ( 空 )是唯一在任何 XML 1.1 文件中都不被允許的字碼。

編碼檢測

[編輯]

Unicode 字元集可被編碼為二進制位元組以儲存或通過多種方式傳輸,這個過程被稱為編碼。Unicode 本身定義了一個覆蓋全字元集的編碼格式,其中知名的包含 UTF-8(不包含位順序記號,是XML 標準文件推薦使用的格式)和 UTF-16。還有許多早於 Unicode 的文字編碼,如 ASCII 和多種 ISO/IEC 8859 字元集,但是它們的字元集都是 Unicode 字元集的子集。

XML 允許使用任何 Unicode 定義的編碼以及其他字元集是Unicode子集的編碼。 XML 還提供了一種機制,使XML 處理器可以在沒有任何先驗知識的情況下可靠地確定正在使用哪種編碼。除 UTF-8 和 UTF-16 之外的編碼不一定能被每個 XML 解析器辨識(有些時候甚至不能辨識 UTF-16,儘管標準要求它也被辨識)。

跳脫

[編輯]

XML 提供了跳脫工具以包含哪些不能直接引入的字元,例如:

  • 字元「<」和「&」是關鍵的語法標記,因此不能出現在 CDATA 部分之外的內容中。 雖然被允許但是不建議在 XML 實體值中使用「<」
  • 某些字元編碼僅支援 Unicode 字元集中的部分字元(子集)。 例如,用 ASCII 編碼 XML 文件是合法的,但 ASCII 缺少 Unicode 字元(例如「é」)的字碼
  • 在作者的機器上可能無法輸入這個字元
  • 某些字元的字形無法在視覺上與其他字元區分開來,例如不間斷空格 (&#xa0;) " " 和空格 (&#x20;) " ",以及西里爾大寫字母 A (&#x410;) 「А」和拉丁文大寫字母 A (&#x41;)「A」
五個預定義實體
跳脫前 跳脫後
&lt; <
&gt; >
&amp; &
&apos; '
&quot; "

所有有效的 Unicode 字元都可以用數字字元參照表示。 例如漢字「中」,其在 Unicode 中的數字代碼是十六進制 4E2D,即十進制 20,013。 如果用戶無法輸入該字元,則仍然可以通過 &#20013; 或&#x4e2d; 代表「中」這個字元。 類似地,字串「I <3 Jörg」可以被編碼為包含在 XML 文件中,如 I &lt;3 J&#xF6;rg

&#0; 是不允許的,因為即使使用數字字元參照,空字元也是 XML 排除的控制字元之一。[11]需要使用 Base64 等替代編碼機制來表示此類字元。

註釋

[編輯]

註釋可以在文件內標記外的、XML聲明之後的任何地方出現,始於 。為了相容SGML,註釋內不得出現"--",這意味着註釋不能巢狀。& 符號在註釋中沒有特殊意義,因此實體和字元參照不會被辨識,自然無法表示文件編碼字元集之外的字元。

國際化

[編輯]

XML 1.0(第五版)和 XML 1.1 支援在元素名稱、屬性、註釋、字元數據和處理指令中直接使用幾乎任何 Unicode 字元(除了在 XML 中具有特殊符號含義的字元,例如小於符號「<」)。 以下是一個格式良好的 XML 文件,包括中文、亞美尼亞語和西里爾語字元:

<?xml version="1.0" encoding="UTF-8"?>
<俄语 լեզու="ռուսերեն">дані</俄语>

句法修正和錯誤處理

[編輯]

XML 規範中將符合語法規範的 XML 文件定義為格式良好的文件。規範中的語法規範中的關鍵點包括:

  • 該文件僅包含正確編碼的合法 Unicode 字元
  • 除非執行標記描述的作用,否則不應出現任何特殊語法字元(例如 < 和 &)
  • 分隔元素的開始標記、結束標記和空白標記正確巢狀,無遺失、無重疊
  • 標籤名稱區分大小寫; 開始標記和結束標記必須完全匹配
  • 標籤名稱不能包含任何非法字元: !"#$%&'()*+,/;<=>?@[\]^`{|}~ ,也不能包含空格,並且不能以「-」、 「.」或數字開頭
  • 僅存在一個根元素
  • 單個根元素包含所有其他元素。

XML 文件的定義排除了那些違反了良構性規則的文字;這些文字根本不是 XML。遇到這種違反規則的情況時,XML 處理器需要報告這些錯誤並停止正常處理。這種政策,偶爾被稱為「嚴格錯誤處理」,與處理 HTML 的程式的行為形成了明顯對比,因為這些程式在存在嚴重標記錯誤的情況下,仍然能夠產生合理的結果。[12]這一方面的政策被批評為違反了 Postel 法則(「對傳送的內容要保守,對接受的內容要寬容」)。[13]

XML 規範將一個有效的 XML 文件定義為一個既符合良構性規則,又遵循文件類型定義(DTD)規則的 XML 文件。[14]

[編輯]

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訊息是否已經結束。

參考文獻

[編輯]
  1. ^ Extensible Markup Language (XML) 1.0. www.w3.org. [2024-02-14]. (原始內容存檔於2024-04-20). 
  2. ^ Extensible Markup Language (XML) 1.0 (Fifth Edition). World Wide Web Consortium. 2008-11-26 [2024-02-14]. (原始內容存檔於2021-03-24) (英語). 
  3. ^ Wayback Machine (PDF). [2024-02-14]. (原始內容存檔 (PDF)於2013-04-24). 
  4. ^ Document license - 2015 version. W3C. [2024-02-14]. (原始內容存檔於2024-05-26) (英語). 
  5. ^ Document license - 2015 version. W3C. [2024-02-14]. (原始內容存檔於2020-01-10). 
  6. ^ Fennell, Philip. Extremes of XML. XML London: 80-86. 2013-09-14. ISBN 978-0-9926471-0-0. doi:10.14337/XMLLondon13.Fennell01 (英語). 
  7. ^ 7.0 7.1 7.2 7.3 7.4 Dykes, Lucinda. XML for Dummies 4th ed. Hoboken, N.J: Wiley. 2005. ISBN 978-0-7645-8845-7. 
  8. ^ Cover, Robin. XML Applications and Initiatives. xml.coverpages.org. [2024-02-15]. (原始內容存檔於2024-05-02). 
  9. ^ Characters. Extensible Markup Language (XML) 1.0 (Fifth Edition). [2024-02-15]. (原始內容存檔於2003-12-24). 
  10. ^ Characters. Extensible Markup Language (XML) 1.1 (Second Edition). [2024-02-15]. (原始內容存檔於2021-08-11). 
  11. ^ Texin, Yergeau, Tex, François. HTML, XHTML, XML and Control Codes. W3C. 2003-09-06 (英語). 
  12. ^ Pilgrim, Mark. The history of draconian error handing in XML. Dive into Mark. 2004-01-16. (原始內容存檔於2011-07-26) (英語). 
  13. ^ There are No Exceptions to Postel’s Law [dive into mark]. Dive into Mark. 2004-01-08. (原始內容存檔於2011-05-14) (英語). 
  14. ^ XML Notepad. CodePlex. (原始內容存檔於2017-11-15) (英語). 

延伸閱讀

[編輯]

外部連結

[編輯]

參見

[編輯]