可扩展标记语言

**可延伸標記式語言**（英語：E**x**tensible **M**arkup **L**anguage，簡稱：**XML**）是一種標記式語言。XML 是從標準通用標記式語言（SGML）中簡化修改出來的。它主要用到的有可延伸標記式語言、可延伸樣式語言（XSL）、XBRL 和 XPath 等。

## 歷史

1960 年代，IBM 開始發展的 **GML**（**G**eneralized **M**arkup **L**anguage）。

GML 的重要概念：

* 檔案中能夠明確的將標示與內容分開
* 所有檔案的標示使用方法均一致

1978 年，ANSI 將 GML 加以整理規範，發佈成為 SGML（The **S**tandard **G**eneralized **M**arkup **L**anguage）。1986 年，XML 的前身起為 ISO 8879，當時被廣泛地運用在各種大型的檔案計劃中，但是 SGML 是一種非常嚴謹的檔案描述法，導致過於龐大複雜，其標準手冊就有 500 多頁，這使它難以理解和學習，進而影響了推廣與應用。

同時 W3C 也發現到 HTML 的問題：

* 不能解決所有解釋資料的問題 - 像是影音檔或化學公式、音樂符號等其他形態的內容。
* 效能問題 - 需要下載整份檔案，才能開始搜尋檔案中的內容。
* 擴充性、彈性、易讀性均不佳。

為了解決以上問題，專家們使用 SGML 精簡製作，並依照 HTML 的發展經驗，產生出一套使用上規則嚴謹，但是簡單的描述資料語言：XML。XML 從 1995 年開始有其雛形，並向 W3C（全球資訊網聯盟）提案，而在 1998 年二月發佈為 W3C 的標準（XML1.0）XML 是在一個這樣的背景下誕生的 —— 為了有一個更中立的方式，讓客戶端自行決定要如何消化、呈現從伺服器端所提供的資訊。

XML 被廣泛用來作為跨平台之間互動數據的形式，主要針對數據的內容，通過不同的格式化描述手段（XSLT，CSS 等）可以完成最終的形式表達（生成對應的 HTML，PDF 或者其他的檔案格式）。

## 用途

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;`，例如， `&amp;` 將繪製為 &.

### 處理器（Processor）與應用（application）

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

### 標記（Markup）與內容（content）

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

### 標籤（Tag）

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

　
: * _start-tag_，如 `<section>`;
* _end-tag_，如 `</section>`;
* _empty-element tag_，如 `<line-break />`.

### 元素（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 文件僅是純粹的資訊標籤，這些標籤意義的展開依賴於應用它的程式。

### 結構

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

## 參考文獻

## 延伸閱讀

## 外部連結

* XML 及 SGML 名詞英漢翻譯表 （繁體中文）
* XML 格式化工具 (中文) （頁面存檔備份，存於網際網路檔案館）
* XML 驗證器 （頁面存檔備份，存於網際網路檔案館） （英文）
* XML 線上格式化工具 （中文）

## 參見

* XHTML
* DTD
* XML Schema
* XLink
* SVG
* XSLT
* X3D
* HTML
* CSS
* RDF
* RSS
  * Unicode
* MXML