XML 快速指南



XML - 概述

XML 代表可擴充套件標記語言 (Extensible Markup Language)。它是一種基於文字的標記語言,源自標準通用標記語言 (SGML)。

XML 標籤標識資料,用於儲存和組織資料,而不是像 HTML 標籤那樣指定如何顯示資料(HTML 標籤用於顯示資料)。XML 在不久的將來不會取代 HTML,但它透過採用 HTML 的許多成功特性引入了新的可能性。

XML 有三個重要的特性使其在各種系統和解決方案中都非常有用:

  • XML 是可擴充套件的 - XML 允許您建立適合您應用程式的自己的自描述標籤或語言。

  • XML 傳輸資料,不呈現資料 - XML 允許您儲存資料,而不管它將如何呈現。

  • XML 是公共標準 - XML 由全球資訊網聯盟 (W3C) 開發,是一個開放標準。

XML 用途

XML 用途簡要列表如下:

  • XML 可以幕後工作,簡化大型網站 HTML 文件的建立。

  • XML 可用於在組織和系統之間交換資訊。

  • XML 可用於資料庫的解除安裝和重新載入。

  • XML 可用於儲存和組織資料,可以定製您的資料處理需求。

  • XML 可以輕鬆與樣式表合併,以建立幾乎任何所需的輸出。

  • 實際上,任何型別的資料都可以表示為 XML 文件。

什麼是標記?

XML 是一種標記語言,它定義了一組規則,用於以既可人讀又可機器讀的格式編碼文件。那麼什麼是標記語言呢?標記是新增到文件中的資訊,它以某種方式增強了文件的含義,因為它標識了文件的各個部分以及它們之間的關係。更具體地說,標記語言是一組符號,可以放置在文件的文字中以劃分和標記該文件的各個部分。

以下示例顯示了嵌入在文字中的 XML 標記的外觀:

<message>
   <text>Hello, world!</text>
</message>

此程式碼片段包含標記符號或標籤,例如 <message>...</message> 和 <text>... </text>。標籤 <message> 和 </message> 標記 XML 程式碼片段的開始和結束。標籤 <text> 和 </text> 包含文字 Hello, world!。

XML 是一種程式語言嗎?

程式語言由語法規則和自己的詞彙表組成,用於建立計算機程式。這些程式指示計算機執行特定任務。XML 不符合程式語言的資格,因為它不執行任何計算或演算法。它通常儲存在簡單的文字檔案中,並由能夠解釋 XML 的專用軟體處理。

XML - 語法

在本節中,我們將討論編寫 XML 文件的簡單語法規則。以下是完整的 XML 文件:

<?xml version = "1.0"?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

您會注意到上面的示例中有兩種資訊:

  • 標記,如 <contact-info>

  • 文字或字元資料,Tutorials Point(040) 123-4567

下圖描述了在 XML 文件中編寫不同型別標記和文字的語法規則。

XML Syntax Rules

讓我們詳細瞭解上圖的每個元件。

XML 宣告

XML 文件可以選擇包含 XML 宣告。它寫成如下:

<?xml version = "1.0" encoding = "UTF-8"?>

其中version 是 XML 版本,encoding 指定文件中使用的字元編碼。

XML 宣告的語法規則

  • XML 宣告區分大小寫,必須以“<?xml>”開頭,其中“xml”小寫。

  • 如果文件包含 XML 宣告,則它必須嚴格作為 XML 文件的第一個語句。

  • XML 宣告必須嚴格作為 XML 文件中的第一個語句。

  • HTTP 協議可以覆蓋您在 XML 宣告中設定的encoding 值。

標籤和元素

XML 檔案由多個 XML 元素構成,也稱為 XML 節點或 XML 標籤。XML 元素的名稱用三角括號 < > 括起來,如下所示:

<element>

標籤和元素的語法規則

元素語法 - 每個 XML 元素都需要用開始元素或結束元素關閉,如下所示:

<element>....</element>

或者在簡單情況下,只需這樣:

<element/>

元素巢狀 - XML 元素可以包含多個 XML 元素作為其子元素,但子元素不能重疊。即,元素的結束標籤必須與最近的不匹配的開始標籤具有相同的名稱。

以下示例顯示了巢狀標籤不正確:

<?xml version = "1.0"?>
<contact-info>
<company>TutorialsPoint
</contact-info>
</company>

以下示例顯示了巢狀標籤正確:

<?xml version = "1.0"?>
<contact-info>
   <company>TutorialsPoint</company>
<contact-info>

根元素 - XML 文件只能有一個根元素。例如,以下不是正確的 XML 文件,因為xy 元素都出現在頂級,沒有根元素:

<x>...</x>
<y>...</y>

以下示例顯示了一個格式正確的 XML 文件:

<root>
   <x>...</x>
   <y>...</y>
</root>

大小寫敏感性 - XML 元素的名稱區分大小寫。這意味著開始元素和結束元素的名稱必須完全相同。

例如,<contact-info><Contact-Info> 不同

XML 屬性

屬性使用名稱/值對指定元素的單個屬性。XML 元素可以有一個或多個屬性。例如:

<a href = "https://tutorialspoint.tw/">Tutorialspoint!</a>

這裡href 是屬性名稱,https://tutorialspoint.tw/ 是屬性值。

XML 屬性的語法規則

  • XML 中的屬性名稱(與 HTML 不同)區分大小寫。也就是說,HREFhref 被認為是兩個不同的 XML 屬性。

  • 同一屬性在一個語法中不能有兩個值。以下示例顯示了不正確的語法,因為屬性b 被指定了兩次

<a b = "x" c = "y" b = "z">....</a>
  • 屬性名稱無需用引號定義,而屬性值必須始終用引號括起來。以下示例演示了不正確的 xml 語法

<a b = x>....</a>

在上例語法中,屬性值沒有用引號定義。

XML 引用

引用通常允許您在 XML 文件中新增或包含其他文字或標記。引用始終以符號"&"(這是一個保留字元)開頭,並以符號";" 結尾。XML 有兩種型別的引用:

  • 實體引用 - 實體引用包含開始和結束分隔符之間的名稱。例如&amp;,其中ampnamename 指的是預定義的文字和/或標記字串。

  • 字元引用 - 這些包含引用,例如&#65;,包含一個井號 (“#”),後跟一個數字。該數字始終指字元的 Unicode 程式碼。在這種情況下,65 指字母“A”。

XML 文字

XML 元素和 XML 屬性的名稱區分大小寫,這意味著開始元素和結束元素的名稱需要使用相同的大小寫。為了避免字元編碼問題,所有 XML 檔案都應儲存為 Unicode UTF-8 或 UTF-16 檔案。

XML 元素之間和 XML 屬性之間的空格字元(如空格、製表符和換行符)將被忽略。

某些字元被 XML 語法本身保留。因此,不能直接使用它們。要使用它們,可以使用一些替代實體,如下所示:

不允許使用的字元 替代實體 字元描述
< &lt; 小於
> &gt; 大於
& &amp; 和號
' &apos; 撇號
" &quot; 引號

XML - 文件

XML 文件是由元素和其他標記組成的有序包中的 XML 資訊的基本單元。XML 文件可以包含各種各樣的資料。例如,數字資料庫、表示分子結構的數字或數學方程式。

XML 文件示例

以下示例顯示了一個簡單的文件:

<?xml version = "1.0"?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

下圖描述了 XML 文件的各個部分。

XML Document

文件序言部分

文件序言位於文件的頂部,位於根元素之前。本節包含:

  • XML 宣告
  • 文件型別宣告

您可以在本章中瞭解有關 XML 宣告的更多資訊:XML 宣告

文件元素部分

文件元素是 XML 的構建塊。它們將文件劃分為一個層次結構的部分,每個部分都具有特定的用途。您可以將文件分成多個部分,以便可以以不同的方式呈現它們,或被搜尋引擎使用。元素可以是容器,包含文字和其他元素的組合。

您可以在本章中瞭解有關 XML 元素的更多資訊:XML 元素

XML - 宣告

本章詳細介紹了 XML 宣告。XML 宣告包含準備 XML 處理器解析 XML 文件的詳細資訊。它是可選的,但如果使用,則必須出現在 XML 文件的第一行。

語法

以下語法顯示 XML 宣告:

<?xml
   version = "version_number"
   encoding = "encoding_declaration"
   standalone = "standalone_status"
?>

每個引數都包含一個引數名稱、一個等號 (=) 和一個帶引號的引數值。下表詳細顯示了上述語法:

引數 引數值 引數描述
版本 1.0 指定使用的 XML 標準版本。
編碼 UTF-8、UTF-16、ISO-10646-UCS-2、ISO-10646-UCS-4、ISO-8859-1 到 ISO-8859-9、ISO-2022-JP、Shift_JIS、EUC-JP 它定義文件中使用的字元編碼。UTF-8 是使用的預設編碼。
獨立 yes 或 no 它通知解析器文件是否依賴於外部源(例如外部文件型別定義 (DTD))的資訊來獲取其內容。預設值為no。將其設定為yes 將告訴處理器解析文件不需要任何外部宣告。

規則

XML 宣告應遵守以下規則:

  • 如果 XML 中存在 XML 宣告,則必須將其放置在 XML 文件的第一行。

  • 如果包含 XML 宣告,則必須包含版本號屬性。

  • 引數名稱和值區分大小寫。

  • 名稱始終小寫。

  • 引數放置的順序很重要。正確的順序是:version、encoding 和 standalone。

  • 可以使用單引號或雙引號。

  • XML 宣告沒有結束標籤,即</?xml>

XML 宣告示例

以下是 XML 宣告的一些示例:

沒有引數的 XML 宣告:

<?xml >

帶有版本定義的 XML 宣告:

<?xml version = "1.0">

定義了所有引數的 XML 宣告:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>

使用單引號定義所有引數的XML宣告 -

<?xml version = '1.0' encoding = 'iso-8859-1' standalone = 'no' ?>

XML - 標籤

讓我們學習XML最重要的部分之一:XML標籤。XML標籤構成了XML的基礎。它們定義了XML中元素的範圍。它們還可以用於插入註釋,宣告解析環境所需的設定以及插入特殊指令。

我們可以將XML標籤大致分為以下幾類:

開始標籤

每個非空XML元素的開頭都用開始標籤標記。以下是開始標籤的示例:

<address>

結束標籤

每個具有開始標籤的元素都應該以結束標籤結尾。以下是結束標籤的示例:

</address>

請注意,結束標籤在元素名稱之前包含一個斜槓("/")。

空標籤

出現在開始標籤和結束標籤之間的文字稱為內容。沒有內容的元素稱為空元素。空元素可以用以下兩種方式表示:

開始標籤緊跟結束標籤,如下所示:

<hr></hr>

完整的空元素標籤如下所示:

<hr />

空元素標籤可以用於任何沒有內容的元素。

XML標籤規則

以下是使用XML標籤時需要遵循的規則:

規則1

XML標籤區分大小寫。以下程式碼行是錯誤語法`

`的示例,因為兩個標籤的大小寫不同,這在XML中被視為錯誤語法。

<address>This is wrong syntax</Address>

以下程式碼顯示了正確的方法,我們使用相同的大小寫來命名開始和結束標籤。

<address>This is correct syntax</address>

規則2

必須按正確的順序關閉XML標籤,即,在另一個元素內部開啟的XML標籤必須在外部元素關閉之前關閉。例如:

<outer_element>
   <internal_element>
      This tag is closed before the outer_element
   </internal_element>
</outer_element>

XML - 元素

XML元素可以定義為XML的構建塊。元素可以作為容器來容納文字、元素、屬性、媒體物件或所有這些。

每個XML文件包含一個或多個元素,其範圍由開始和結束標籤分隔,或者對於空元素,由空元素標籤分隔。

語法

以下是編寫XML元素的語法:

<element-name attribute1 attribute2>
....content
</element-name>

其中:

  • element-name是元素的名稱。其名稱在開始和結束標籤中的大小寫必須匹配。

  • attribute1, attribute2是元素的屬性,用空格分隔。屬性定義了元素的屬性。它將名稱與值相關聯,值是字元字串。屬性的寫法如下:

name = "value"

name後跟一個=號和一個用雙引號(" ")或單引號(' ')括起來的字串value

空元素

空元素(沒有內容的元素)具有以下語法:

<name attribute1 attribute2.../>

以下是用各種XML元素編寫的XML文件示例:

<?xml version = "1.0"?>
<contact-info>
   <address category = "residence">
      <name>Tanmay Patil</name>
      <company>TutorialsPoint</company>
      <phone>(011) 123-4567</phone>
   </address>
</contact-info>

XML元素規則

XML元素需要遵循以下規則:

  • 元素名稱可以包含任何字母數字字元。名稱中唯一允許的標點符號是連字元 (-)、下劃線 (_) 和句點 (.)。

  • 名稱區分大小寫。例如,Address、address和ADDRESS是不同的名稱。

  • 元素的開始和結束標籤必須相同。

  • 元素作為容器,可以包含文字或元素,如上例所示。

XML - 屬性

本章描述了XML屬性。屬性是XML元素的一部分。一個元素可以有多個唯一的屬性。屬性提供了關於XML元素的更多資訊。更準確地說,它們定義了元素的屬性。XML屬性始終是名稱-值對。

語法

XML屬性具有以下語法:

<element-name attribute1 attribute2 >
....content..
< /element-name>

其中attribute1attribute2具有以下形式:

name = "value"

value必須用雙引號(" ")或單引號(' ')括起來。這裡,attribute1attribute2是唯一的屬性標籤。

屬性用於為元素新增唯一的標籤,將標籤放在類別中,添加布爾標誌,或將其與某些資料字串關聯。以下示例演示了屬性的使用:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE garden [
   <!ELEMENT garden (plants)*>
   <!ELEMENT plants (#PCDATA)>
   <!ATTLIST plants category CDATA #REQUIRED>
]>

<garden>
   <plants category = "flowers" />
   <plants category = "shrubs">
   </plants>
</garden>

當您不想為每種情況建立一個新元素時,屬性用於區分同名元素。因此,使用屬性可以更詳細地區分兩個或多個相似的元素。

在上例中,我們透過包含屬性category併為每個元素分配不同的值來對植物進行分類。因此,我們有兩個類別plants,一個flowers,另一個shrubs。因此,我們有兩個具有不同屬性的plant元素。

您還可以觀察到,我們在XML開頭聲明瞭此屬性。

屬性型別

下表列出了屬性型別:

屬性型別 描述
StringType 它接受任何文字字串作為值。CDATA是StringType。CDATA是字元資料。這意味著,任何非標記字元的字串都是屬性的合法部分。
TokenizedType

這是一個更受限制的型別。在屬性值被規範化後,將應用語法中提到的有效性約束。TokenizedType屬性如下:

  • ID - 用於將元素指定為唯一。

  • IDREF - 用於引用已為另一個元素命名的ID。

  • IDREFS - 用於引用元素的所有ID。

  • ENTITY - 指示屬性將表示文件中的外部實體。

  • ENTITIES - 指示屬性將表示文件中的外部實體。

  • NMTOKEN - 與CDATA類似,但對屬性中可以包含哪些資料有限制。

  • NMTOKENS - 與CDATA類似,但對屬性中可以包含哪些資料有限制。

EnumeratedType

在其宣告中有一組預定義的值。從中,它必須分配一個值。有兩種列舉屬性:

  • NotationType - 宣告元素將被引用到XML文件其他地方宣告的NOTATION。

  • Enumeration - 列舉允許您定義屬性值必須匹配的特定值列表。

元素屬性規則

以下是屬性需要遵循的規則:

  • 屬性名稱在同一個開始標籤或空元素標籤中不能出現多次。

  • 必須使用屬性列表宣告在文件型別定義 (DTD) 中宣告屬性。

  • 屬性值不能包含對外部實體的直接或間接實體引用。

  • 屬性值中直接或間接引用的任何實體的替換文字不能包含小於號 (<)

XML - 註釋

本章解釋了XML註釋在XML文件中的工作原理。XML註釋類似於HTML註釋。註釋作為筆記或行新增,以瞭解XML程式碼的目的。

註釋可用於包含相關連結、資訊和術語。它們僅在原始碼中可見;不在XML程式碼中。註釋可以出現在XML程式碼中的任何位置。

語法

XML註釋具有以下語法:

<!--Your comment-->

註釋以<!--開頭,以-->結尾。您可以在字元之間新增文字註釋作為註釋。您不能將一個註釋巢狀在另一個註釋內。

示例

以下示例演示了在XML文件中使用註釋:

<?xml version = "1.0" encoding = "UTF-8" ?>
<!--Students grades are uploaded by months-->
<class_list>
   <student>
      <name>Tanmay</name>
      <grade>A</grade>
   </student>
</class_list>

<!---->字元之間的任何文字都被視為註釋。

XML註釋規則

XML註釋應遵循以下規則:

  • 註釋不能出現在XML宣告之前。
  • 註釋可以出現在文件中的任何位置。
  • 註釋不能出現在屬性值中。
  • 註釋不能巢狀在其他註釋內。

XML - 字元實體

本章描述了XML字元實體。在瞭解字元實體之前,讓我們首先了解什麼是XML實體。

正如W3 Consortium所述,實體的定義如下:

“文件實體作為實體樹的根和XML處理器的起點”。

這意味著,實體是XML中的佔位符。這些可以在文件序言或DTD中宣告。有不同型別的實體,本章將討論字元實體。

HTML和XML都有一些保留用於其自身的符號,這些符號不能用作XML程式碼中的內容。例如,<>符號用於開啟和關閉XML標籤。要顯示這些特殊字元,可以使用字元實體。

有一些特殊字元或符號無法直接從鍵盤輸入。字元實體也可以用於顯示這些符號/特殊字元。

字元實體型別

有三種類型的字元實體:

  • 預定義字元實體
  • 編號字元實體
  • 命名字元實體

預定義字元實體

引入它們是為了避免使用某些符號時出現的歧義。例如,當小於 (<) 或大於 (>) 符號與角標籤 (<>) 一起使用時,會觀察到歧義。字元實體基本上用於分隔XML中的標籤。以下是XML規範中預定義字元實體的列表。這些可以用來表達字元而不會產生歧義。

  • 與號 - &amp;

  • 單引號 - &apos;

  • 大於 - &gt;

  • 小於 - &lt;

  • 雙引號 - &quot;

數字字元實體

數字引用用於引用字元實體。數字引用可以是十進位制或十六進位制格式。由於有數千個可用的數字引用,這些引用有點難以記住。數字引用透過其在Unicode字元集中的編號來引用字元。

十進位制數字引用的通用語法為:

&# decimal number ;

十六進位制數字引用的通用語法為:

&#x Hexadecimal number ;

下表列出了一些預定義的字元實體及其數值:

實體名稱 字元 十進位制引用 十六進位制引用
quot " &#34; &#x22;
amp & &#38; &#x26;
apos ' &#39; &#x27;
lt < &#60; &#x3C;
gt > &#62; &#x3E;

命名字元實體

由於難以記住數字字元,因此最常用的字元實體型別是命名字元實體。在這裡,每個實體都用一個名稱標識。

例如:

  • 'Aacute' 代表帶有重音符的大寫 字元。

  • 'ugrave' 代表帶有重音符的小寫

XML - CDATA 節

本章將討論XML CDATA 部分。CDATA表示字元資料。CDATA定義為不被解析器解析的文字塊,但會被識別為標記。

預定義實體,如&lt;、&gt;&amp;,需要輸入,並且通常難以在標記中閱讀。在這種情況下,可以使用CDATA部分。透過使用CDATA部分,您可以命令解析器文件的特定部分不包含標記,應將其視為常規文字。

語法

以下是CDATA部分的語法:

<![CDATA[
   characters with markup
]]>

上述語法由三個部分組成:

  • CDATA 開始部分 - CDATA 以九個字元的分隔符<![CDATA[開頭

  • CDATA 結束部分 - CDATA 部分以]]>分隔符結尾。

  • CDATA 部分 - 這兩個括號之間的字元被解釋為字元,而不是標記。此部分可能包含標記字元 (<、> 和 &),但XML處理器會忽略它們。

示例

以下標記程式碼顯示了CDATA的示例。這裡,CDATA部分中編寫的每個字元都被解析器忽略。

<script>
   <![CDATA[
      <message> Welcome to TutorialsPoint </message>
   ]] >
</script >

在上文的語法中,`` 和 `` 之間的所有內容都被視為字元資料,而不是標記。

CDATA 規則

對於 XML CDATA,必須遵循以下規則:

  • CDATA 在 XML 文件中的任何位置都不能包含字串“]]>”。
  • CDATA 區段不允許巢狀。

XML - 空格

本章將討論 XML 文件中的空格處理。空格是空格、製表符和換行符的集合。它們通常用於使文件更易於閱讀。

XML 文件包含兩種型別的空格——有效空格和無效空格。下面將透過示例對兩者進行解釋。

有效空格

有效空格出現在包含文字和標記同時存在的元素中。例如:

<name>TanmayPatil</name>

<name>Tanmay Patil</name>

由於TanmayPatil 之間的空格,以上兩個元素有所不同。讀取 XML 檔案中此元素的任何程式都必須保持這種區別。

無效空格

無效空格是指只允許元素內容的空格。例如:

<address.category = "residence">
<address....category = "..residence">

以上示例相同。此處,空格由點 (.) 表示。在上例中,`address` 和 `category` 之間的空格是無效的。

可以為元素附加一個名為xml:space 的特殊屬性。這表示應用程式不應刪除該元素的空格。可以將此屬性設定為defaultpreserve,如下例所示:

<!ATTLIST address  xml:space (default|preserve) 'preserve'>

其中:

  • default 表示應用程式的預設空格處理模式對於此元素是可以接受的。

  • preserve 表示應用程式應保留所有空格。

XML - 處理

本章介紹處理指令 (PI)。根據 XML 1.0 建議的定義:

“處理指令 (PI) 允許文件包含應用程式的指令。PI 不是文件字元資料的一部分,但必須傳遞給應用程式。”

處理指令 (PI) 可用於將資訊傳遞給應用程式。PI 可以出現在文件中標記之外的任何位置。它們可以出現在序言中(包括文件型別定義 (DTD))、文字內容中或文件之後。

語法

以下是 PI 的語法:

<?target instructions?>

其中

  • target - 指明指令的目標應用程式。

  • instruction - 描述應用程式要處理的資訊的字元。

PI 以特殊標記<? 開頭,以?> 結尾。字串?> 出現後,內容處理立即結束。

示例

PI 很少使用。它們主要用於將 XML 文件連結到樣式表。以下是一個示例:

<?xml-stylesheet href = "tutorialspointstyle.css" type = "text/css"?>

此處,targetxml-stylesheethref="tutorialspointstyle.css"type="text/css"datainstructions,目標應用程式將在處理給定的 XML 文件時使用這些資料或指令。

在這種情況下,瀏覽器透過指示應在顯示之前轉換 XML 來識別目標;第一個屬性宣告轉換的型別為 XSL,第二個屬性指向其位置。

處理指令規則

PI 可以包含任何資料,但?> 組合除外,該組合被解釋為結束分隔符。以下是兩個有效 PI 的示例:

<?welcome to pg = 10 of tutorials point?>

<?welcome?>

XML - 編碼

編碼是將 Unicode 字元轉換為其等效二進位制表示的過程。當 XML 處理器讀取 XML 文件時,它會根據編碼型別對文件進行編碼。因此,我們需要在 XML 宣告中指定編碼型別。

編碼型別

主要有兩種編碼型別:

  • UTF-8
  • UTF-16

UTF 代表UCS 變換格式,UCS 本身代表通用字元集。8 或 16 指的是表示字元所用的位數。它們是 8 位(1 到 4 個位元組)或 16 位(2 或 4 個位元組)。對於沒有編碼資訊的文件,預設情況下設定為 UTF-8。

語法

編碼型別包含在 XML 文件的序言部分中。UTF-8 編碼的語法如下:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>

UTF-16 編碼的語法如下:

<?xml version = "1.0" encoding = "UTF-16" standalone = "no" ?>

示例

以下示例顯示了編碼的宣告:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

在上例中,encoding="UTF-8" 指定使用 8 位來表示字元。要表示 16 位字元,可以使用UTF-16 編碼。

使用 UTF-8 編碼的 XML 檔案的大小往往小於使用 UTF-16 格式編碼的檔案。

XML - 驗證

驗證是一個驗證 XML 文件的過程。如果 XML 文件的內容與元素、屬性和相關的文件型別宣告 (DTD) 匹配,並且文件符合其中表達的約束,則該文件被稱為有效。XML 解析器透過兩種方式處理驗證。它們是:

  • 格式良好的 XML 文件
  • 有效的 XML 文件

格式良好的 XML 文件

如果 XML 文件符合以下規則,則稱其為格式良好

  • 非 DTD XML 檔案必須使用預定義的字元實體來表示amp(&)apos(單引號)gt(>)lt(<)quot(雙引號)

  • 它必須遵循標記的順序,即必須在關閉外部標記之前關閉內部標記。

  • 它的每個開始標記都必須有一個結束標記,或者它必須是一個自結束標記。(``....` - 技術教學` 或 ``)。</p></li> <li><p>它在一個開始標記中只能有一個屬性,該屬性需要用引號括起來。</p></li> <li><p>必須宣告除<b>amp(&)</b>、<b>apos(單引號)</b>、<b>gt(>)</b>、<b>lt(<)</b>、<b>quot(雙引號)</b> 以外的其他實體。</p></li> </ul> <h3>示例</h3> <p>以下是一個格式良好的 XML 文件示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>以上示例被稱為格式良好,因為:</p> <ul class="list"> <li><p>它定義了文件的型別。此處,文件型別為<b>element</b> 型別。</p></li> <li><p>它包含一個名為<b>address</b> 的根元素。</p></li> <li><p>name、company 和 phone 之間的每個子元素都包含在其自解釋標記中。</p></li> <li><p>保持標記的順序。</p></li> </ul> <h2>有效的 XML 文件</h2> <p>如果 XML 文件格式良好且具有關聯的文件型別宣告 (DTD),則稱其為有效的 XML 文件。我們將在章節<a href="/xml/xml_dtds.htm">XML - DTDs</a>中詳細學習 DTD。</p> <h1>XML - DTDs</h1> <p>XML 文件型別宣告,通常稱為 DTD,是一種精確描述 XML 語言的方法。DTD 根據相應 XML 語言的語法規則檢查 XML 文件的詞彙和結構的有效性。</p> <p>XML DTD 可以指定在文件內,也可以儲存在單獨的文件中,然後單獨連結。</p> <h2>語法</h2> <p>DTD 的基本語法如下:</p> <pre class="prettyprint notranslate"><!DOCTYPE element DTD identifier [ declaration1 declaration2 ........ ]> </pre> <p>在上文的語法中:</p> <ul class="list"> <li><p><b>DTD</b> 以`<!DOCTYPE` 分隔符開頭。</p></li> <li><p><b>element</b> 告訴解析器從指定的根元素解析文件。</p></li> <li><p><b>DTD 識別符號</b>是文件型別定義的識別符號,它可能是系統上檔案的路徑或網際網路上檔案的 URL。如果 DTD 指向外部路徑,則稱為<b>外部子集</b>。</p></li> <li><p><b>方括號 [ ]</b> 包含一個可選的實體宣告列表,稱為<i>內部子集</i>。</p></li> </ul> <h2>內部 DTD</h2> <p>如果在 XML 檔案中宣告元素,則 DTD 稱為內部 DTD。要將其稱為內部 DTD,XML 宣告中的`standalone` 屬性必須設定為<b>yes</b>。這意味著宣告獨立於外部源工作。</p> <h3>語法</h3> <p>以下是內部 DTD 的語法:</p> <pre class="result notranslate"><!DOCTYPE root-element [element-declarations]> </pre> <p>其中<i>root-element</i> 是根元素的名稱,<i>element-declarations</i> 是宣告元素的地方。</p> <h3>示例</h3> <p>以下是一個內部 DTD 的簡單示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>讓我們來看一下上面的程式碼:</p> <p><b>開始宣告</b>- 使用以下語句開始 XML 宣告。</p> <pre class="result notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> </pre> <p><b>DTD</b> - 在 XML 頭之後,緊跟著<i>文件型別宣告</i>,通常稱為 DOCTYPE -</p> <pre class="result notranslate"><!DOCTYPE address [ </pre> <p>DOCTYPE 宣告的元素名稱開頭有一個感嘆號 (!) 。DOCTYPE 通知解析器此 XML 文件與 DTD 相關聯。</p> <p><b>DTD 主體</b> - DOCTYPE 宣告之後是 DTD 的主體,您可以在其中宣告元素、屬性、實體和符號。</p> <pre class="prettyprint notranslate"><!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone_no (#PCDATA)> </pre> <p>此處聲明瞭幾個構成`<name>` 文件詞彙表的元素。`<!ELEMENT name (#PCDATA)>` 將元素<i>name</i> 定義為“#PCDATA”型別。此處 #PCDATA 表示可解析的文字資料。</p> <p><b>結束宣告</b> - 最後,使用右括號和右尖括號 (<b>]></b>) 關閉 DTD 的宣告部分。這有效地結束了定義,此後,XML 文件緊隨其後。</p> <h3>規則</h3> <ul class="list"> <li><p>文件型別宣告必須出現在文件的開頭(僅在 XML 頭之前)——不允許出現在文件中的其他任何位置。</p></li> <li><p>與 DOCTYPE 宣告類似,元素宣告必須以感嘆號開頭。</p></li> <li><p>文件型別宣告中的名稱必須與根元素的元素型別匹配。</p></li> </ul> <h2>外部 DTD</h2> <p>在外部 DTD 中,元素在 XML 檔案之外宣告。透過指定系統屬性來訪問它們,系統屬性可以是合法的<i>.dtd</i> 檔案或有效的 URL。要將其稱為外部 DTD,XML 宣告中的`standalone` 屬性必須設定為<b>no</b>。這意味著宣告包含來自外部源的資訊。</p> <h3>語法</h3> <p>以下是外部 DTD 的語法:</p> <pre class="result notranslate"><!DOCTYPE root-element SYSTEM "file-name"> </pre> <p>其中<i>file-name</i> 是具有<i>.dtd</i> 副檔名的檔案。</p> <h3>示例</h3> <p>以下示例顯示了外部 DTD 的用法:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?> <!DOCTYPE address SYSTEM "address.dtd"> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>DTD 檔案<b>address.dtd</b> 的內容如下所示:</p> <pre class="prettyprint notranslate"><!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> </pre> <h2>型別</h2> <p>您可以使用<b>系統識別符號</b>或<b>公共識別符號</b>引用外部 DTD。</p> <h3>系統識別符號</h3> <p>系統識別符號使您可以指定包含 DTD 宣告的外部檔案的位置。語法如下:</p> <pre class="result notranslate"><!DOCTYPE name SYSTEM "address.dtd" [...]> </pre> <p>如您所見,它包含關鍵字 SYSTEM 和指向文件位置的 URI 引用。</p> <h3>公共識別符號</h3> <p>公共識別符號提供了一種查詢 DTD 資源的機制,其寫法如下:</p> <pre class="result notranslate"><!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN"> </pre> <p>如你所見,它以關鍵字 PUBLIC 開頭,後面跟著一個特殊的識別符號。公共識別符號用於識別目錄中的條目。公共識別符號可以遵循任何格式,但是,一種常用的格式稱為<b>正式公共識別符號 (Formal Public Identifiers, 或 FPI)</b>。</p> <h1>XML - 模式</h1> <p>XML Schema 通常被稱為<b>XML 模式定義 (XML Schema Definition, XSD)</b>。它用於描述和驗證 XML 資料的結構和內容。XML 模式定義元素、屬性和資料型別。模式元素支援名稱空間。它類似於描述資料庫中資料的資料庫模式。</p> <h2>語法</h2> <p>您需要在 XML 文件中宣告一個模式,如下所示:</p> <h3>示例</h3> <p>以下示例顯示瞭如何使用模式:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8"?> <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"> <xs:element name = "contact"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> <xs:element name = "phone" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </pre> <p>XML 模式背後的基本思想是它們描述了 XML 文件可以採用的合法格式。</p> <h2>元素</h2> <p>正如我們在<a href="/xml/xml_elements.htm">XML - 元素</a>章節中看到的,元素是 XML 文件的構建塊。元素可以在 XSD 中定義如下:</p> <pre class="prettyprint notranslate"><xs:element name = "x" type = "y"/> </pre> <h2>定義型別</h2> <p>您可以透過以下方式定義 XML 模式元素:</p> <h3>簡單型別</h3> <p>簡單型別元素僅在文字上下文中使用。一些預定義的簡單型別包括:xs:integer、xs:boolean、xs:string、xs:date。例如:</p> <pre class="prettyprint notranslate"><xs:element name = "phone_number" type = "xs:int" /> </pre> <h3>複雜型別</h3> <p>複雜型別是其他元素定義的容器。這允許您指定元素可以包含哪些子元素,並在 XML 文件中提供一些結構。例如:</p> <pre class="prettyprint notranslate"><xs:element name = "Address"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> <xs:element name = "phone" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>在上面的例子中,<i>Address</i> 元素包含子元素。這是一個用於其他<b><xs:element></b>定義的容器,允許在 XML 文件中構建簡單的元素層次結構。</p> <h3>全域性型別</h3> <p>使用全域性型別,您可以在文件中定義單個型別,所有其他引用都可以使用該型別。例如,假設您想為公司的不同地址概括<i>person</i>和<i>company</i>。在這種情況下,您可以定義一個通用型別,如下所示:</p> <pre class="prettyprint notranslate"><xs:element name = "AddressType"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>現在讓我們在我們的示例中使用此型別,如下所示:</p> <pre class="prettyprint notranslate"><xs:element name = "Address1"> <xs:complexType> <xs:sequence> <xs:element name = "address" type = "AddressType" /> <xs:element name = "phone1" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name = "Address2"> <xs:complexType> <xs:sequence> <xs:element name = "address" type = "AddressType" /> <xs:element name = "phone2" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>無需兩次定義名稱和公司(一次用於<i>Address1</i>,一次用於<i>Address2</i>),我們現在只有一個定義。這使得維護更簡單,即,如果您決定向地址新增“郵政編碼”元素,您只需要在一個地方新增它們。</p> <h2>屬性</h2> <p>XSD 中的屬性在元素內提供額外資訊。屬性具有如下所示的<i>name</i>和<i>type</i>屬性:</p> <pre class="prettyprint notranslate"><xs:attribute name = "x" type = "y"/> </pre> <h1>XML - 樹狀結構</h1> <p>XML 文件始終具有描述性。樹狀結構通常被稱為<b>XML 樹</b>,它在輕鬆描述任何 XML 文件方面起著重要作用。</p> <p>樹狀結構包含根(父)元素、子元素等等。透過使用樹狀結構,您可以從根開始瞭解所有後續分支和子分支。解析從根開始,然後向下移動到第一個分支的元素,從那裡取第一個分支,依此類推,直到葉子節點。</p> <h2>示例</h2> <p>以下示例演示了簡單的 XML 樹結構:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <Company> <Employee> <FirstName>Tanmay</FirstName> <LastName>Patil</LastName> <ContactNo>1234567890</ContactNo> <Email>tanmaypatil@xyz.com</Email> <Address> <City>Bangalore</City> <State>Karnataka</State> <Zip>560212</Zip> </Address> </Employee> </Company> </pre> <p>以下樹結構表示上述 XML 文件:</p> <img src="/xml/images/tree_structure.jpg" alt="XML Trees Structure"> <p>在上圖中,有一個名為<company>的根元素。在裡面,還有一個元素<Employee>。在 employee 元素內,有五個分支,名為<FirstName>、<LastName>、<ContactNo>、<Email>和<Address>。在<Address>元素內,有三個子分支,名為<City> <State>和<Zip>。</p> <h1>XML - DOM</h1> <p><b>文件物件模型 (Document Object Model, DOM)</b>是 XML 的基礎。XML 文件具有稱為<i>節點</i>的資訊單元的層次結構;DOM 是一種描述這些節點及其之間關係的方法。</p> <p>DOM 文件是按層次結構組織的節點或資訊片段的集合。這種層次結構允許開發人員遍歷樹來查詢特定資訊。由於它基於資訊的層次結構,因此 DOM 被稱為<i>基於樹的</i>。</p> <p>另一方面,XML DOM 還提供了一個 API,允許開發人員在樹中的任何點新增、編輯、移動或刪除節點,以建立應用程式。</p> <h2>示例</h2> <p>以下示例 (sample.htm) 將 XML 文件 (“address.xml”) 解析為 XML DOM 物件,然後使用 JavaScript 從中提取一些資訊:</p> <pre class="prettyprint notranslate"><!DOCTYPE html> <html> <body> <h1>TutorialsPoint DOM example </h1> <div> <b>Name:</b> <span id = "name"></span><br> <b>Company:</b> <span id = "company"></span><br> <b>Phone:</b> <span id = "phone"></span> </div> <script> if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","/xml/address.xml",false); xmlhttp.send(); xmlDoc = xmlhttp.responseXML; document.getElementById("name").innerHTML= xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue; document.getElementById("company").innerHTML= xmlDoc.getElementsByTagName("company")[0].childNodes[0].nodeValue; document.getElementById("phone").innerHTML= xmlDoc.getElementsByTagName("phone")[0].childNodes[0].nodeValue; </script> </body> </html> </pre> <p><b>address.xml</b>的內容如下:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <p>現在讓我們將這兩個檔案<b>sample.htm</b>和<b>address.xml</b>放在同一個目錄<b>/xml</b>中,並透過在任何瀏覽器中開啟它來執行<b>sample.htm</b>檔案。這應該產生以下輸出。</p> <img src="/xml/images/xml_dom_example.png" alt="XML DOM Output"> <p>在這裡,您可以看到如何提取每個子節點以顯示其值。</p> <h1>XML - 名稱空間</h1> <p><b>名稱空間</b>是一組唯一的名稱。名稱空間是一種機制,透過它可以將元素和屬性名稱分配給一個組。名稱空間由 URI(統一資源識別符號)標識。</p> <h2>名稱空間宣告</h2> <p>名稱空間使用保留屬性宣告。這樣的屬性名稱必須是<b>xmlns</b>或以<b>xmlns:</b>開頭,如下所示:</p> <pre class="result notranslate"><element xmlns:name = "URL"> </pre> <h2>語法</h2> <ul class="list"> <li><p>名稱空間以關鍵字<b>xmlns</b>開頭。</p></li> <li><p>單詞<b>name</b>是名稱空間字首。</p></li> <li><p><b>URL</b>是名稱空間識別符號。</p></li> </ul> <h2>示例</h2> <p>名稱空間隻影響文件中的有限區域。包含宣告的元素及其所有後代都在名稱空間的範圍內。以下是一個簡單的 XML 名稱空間示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8"?> <cont:contact xmlns:cont = "www.tutorialspoint.com/profile"> <cont:name>Tanmay Patil</cont:name> <cont:company>TutorialsPoint</cont:company> <cont:phone>(011) 123-4567</cont:phone> </cont:contact> </pre> <p>這裡,名稱空間字首是<b>cont</b>,名稱空間識別符號 (URI) 為<i>www.tutorialspoint.com/profile</i>。這意味著,帶有<b>cont</b>字首的元素名稱和屬性名稱(包括 contact 元素),都屬於<i>www.tutorialspoint.com/profile</i>名稱空間。</p> <h1>XML - 資料庫</h1> <p><b>XML 資料庫</b>用於以 XML 格式儲存大量資訊。隨著 XML 在各個領域的應用越來越廣泛,需要一個安全的地方來儲存 XML 文件。資料庫中儲存的資料可以使用<b>XQuery</b>查詢、序列化並匯出為所需的格式。</p> <h2>XML 資料庫型別</h2> <p>XML 資料庫主要有兩種型別:</p> <ul class="list"> <li>支援 XML 的</li> <li>原生 XML (NXD)</li> </ul> <h2>支援 XML 的資料庫</h2> <p>支援 XML 的資料庫只不過是為轉換 XML 文件而提供的擴充套件。這是一個關係資料庫,其中資料儲存在由行和列組成的表中。表包含一組記錄,這些記錄又包含欄位。</p> <h3>原生 XML 資料庫</h3> <p>原生 XML 資料庫基於容器而不是表格式。它可以儲存大量的 XML 文件和資料。原生 XML 資料庫由<b>XPath</b>表示式查詢。</p> <p>原生 XML 資料庫優於支援 XML 的資料庫。與支援 XML 的資料庫相比,它在儲存、查詢和維護 XML 文件方面具有更高的能力。</p> <h3>示例</h3> <p>以下示例演示了 XML 資料庫:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <contact1> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact1> <contact2> <name>Manisha Patil</name> <company>TutorialsPoint</company> <phone>(011) 789-4567</phone> </contact2> </contact-info> </pre> <p>在這裡,建立了一個聯絡人表,其中包含聯絡人的記錄(contact1 和 contact2),這些記錄又包含三個實體:<i>name、company</i>和<i>phone</i>。</p> <h1>XML - 檢視器</h1> <p>本章介紹了<b>檢視 XML 文件的各種方法</b>。可以使用簡單的文字編輯器或任何瀏覽器來檢視 XML 文件。大多數主要的瀏覽器都支援 XML。可以透過雙擊 XML 文件(如果它是本地檔案)或在位址列中鍵入 URL 路徑(如果檔案位於伺服器上)在瀏覽器中開啟 XML 檔案,就像我們在瀏覽器中開啟其他檔案一樣。XML 檔案以<b>“.xml”</b>副檔名儲存。</p> <p>讓我們探索可以檢視 XML 檔案的各種方法。以下示例 (sample.xml) 用於檢視本章的所有部分。</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <h2>文字編輯器</h2> <p>任何簡單的文字編輯器,如記事本、TextPad 或 TextEdit,都可以用來建立或檢視 XML 文件,如下所示:</p> <img src="/xml/images/xml_viewer_notepad.jpg" alt="View XML In Notepad"> <h2>Firefox 瀏覽器</h2> <p>透過雙擊檔案在 Chrome 中開啟上述 XML 程式碼。XML 程式碼以彩色顯示編碼,使程式碼更易於閱讀。它在 XML 元素左側顯示加號 (+) 或減號 (-)。當我們單擊減號 (-) 時,程式碼會隱藏。當我們單擊加號 (+) 時,程式碼行會展開。Firefox 中的輸出如下所示:</p> <img src="/xml/images/xml_viewer_firefox.png" alt="View XML In Firefox"> <h2>Chrome 瀏覽器</h2> <p>在 Chrome 瀏覽器中開啟上述 XML 程式碼。程式碼顯示如下:</p> <img src="/xml/images/xml_viewer_chrome.png" alt="View XML In Chrome"> <h2>XML 文件中的錯誤</h2> <p>如果您的 XML 程式碼缺少某些標記,則瀏覽器中會顯示一條訊息。讓我們嘗試在 Chrome 中開啟以下 XML 檔案:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <p>在上面的程式碼中,起始標記和結束標記不匹配(參考 contact_info 標記),因此瀏覽器會顯示錯誤訊息,如下所示:</p> <img src="/xml/images/xml_viewer_error.png" alt="View XML Error"> <h1>XML - 編輯器</h1> <p><b>XML 編輯器</b>是一種標記語言編輯器。可以使用現有的編輯器(例如記事本、WordPad 或任何類似的文字編輯器)來編輯或建立 XML 文件。您還可以線上或下載專業 XML 編輯器,它具有更強大的編輯功能,例如:</p> <ul class="list"> <li>它會自動關閉未關閉的標記。</li> <li>它嚴格檢查語法。</li> <li>它以彩色突出顯示 XML 語法,以提高可讀性。</li> <li>它可以幫助您編寫有效的 XML 程式碼。</li> <li>它提供針對 DTD 和模式的 XML 文件的自動驗證。</li> </ul> <h2>開源 XML 編輯器</h2> <p>以下是一些開源 XML 編輯器:</p> <ul class="list"> <li><p><b>線上 XML 編輯器</b> - 這是一款輕量級的 XML 編輯器,您可以線上使用。</p></li> <li><p><a href="http://www.xerlin.org/" target="_blank" rel="nofollow">Xerlin</a> - Xerlin 是一個針對 Java 2 平臺的開源 XML 編輯器,在 Apache 許可下發布。它是一個基於 Java 的 XML 建模應用程式,可以輕鬆建立和編輯 XML 檔案。</p></li> <li><p><a href="https://sourceforge.net/projects/camprocessor/" target="_blank" rel="nofollow">CAM - 內容組裝機制 (CAM - Content Assembly Mechanism)</a> - CAM XML 編輯器工具帶有 Oracle 贊助的 XML+JSON+SQL Open-XDX。</p></li> </ul> <h1>XML - 解析器</h1> <p><b>XML 解析器</b>是一個軟體庫或包,它為客戶端應用程式提供與 XML 文件互動的介面。它檢查 XML 文件的格式是否正確,也可能驗證 XML 文件。現代瀏覽器具有內建的 XML 解析器。</p> <p>下圖顯示了 XML 解析器如何與 XML 文件互動:</p> <img src="/xml/images/xml_parser.png" alt="XML Parser"> <p>解析器的目標是將 XML 轉換為可讀的程式碼。</p> <p>為了簡化解析過程,有一些商業產品可以促進 XML 文件的分解併產生更可靠的結果。</p> <p>一些常用的解析器如下所示:</p> <ul class="list"> <li><p><b>MSXML (Microsoft Core XML Services)</b> - 這是 Microsoft 提供的一套標準 XML 工具,其中包括一個解析器。</p></li> <li><p><b>System.Xml.XmlDocument</b> - 此類是 .NET 庫的一部分,其中包含許多與使用 XML 相關的不同類。</p></li> <li><p><b>Java 內建解析器</b> - Java 庫有自己的解析器。該庫的設計使得您可以用外部實現(例如 Apache 的 Xerces 或 Saxon)替換內建解析器。</p></li> <li><p><b>Saxon</b> - Saxon 提供用於解析、轉換和查詢 XML 的工具。</p></li> <li><p><b>Xerces</b> - Xerces 使用 Java 實現,由著名的開源 Apache 軟體基金會開發。</p></li> </ul> <h1>XML - 處理器</h1> <p>當軟體程式讀取 XML 文件並相應地採取行動時,這稱為<i>處理</i>XML。任何可以讀取和處理 XML 文件的程式都稱為<i>XML 處理器</i>。XML 處理器讀取 XML 檔案並將其轉換為記憶體中的結構,程式的其餘部分可以訪問這些結構。</p> <p>最基本的 XML 處理器讀取 XML 文件並將其轉換為內部表示,供其他程式或子程式使用。這稱為<i>解析器</i>,它是每個 XML 處理程式的重要組成部分。</p> <p>處理器涉及處理指令,這可以在<a href="/xml/xml_processing.htm">處理指令</a>章節中學習。</p> <h2>型別</h2> <p>XML 處理器分為<b>驗證</b>型或<b>非驗證</b>型,這取決於它們是否檢查 XML 文件的有效性。發現有效性錯誤的處理器必須能夠報告它,但可以繼續進行正常的處理。</p> <p><b>一些驗證解析器包括</b> − xml4c(IBM,C++編寫),xml4j(IBM,Java編寫),MSXML(微軟,Java編寫),TclXML(TCL),xmlproc(Python),XML::Parser(Perl),Java Project X(Sun,Java編寫)。</p> <p><b>一些非驗證解析器包括</b> − OpenXML(Java),Lark(Java),xp(Java),AElfred(Java),expat(C),XParse(JavaScript),xmllib(Python)。</p> <div class="library-page-bottom-nav "> <div class="button button--blue" id="print-page"> <svg fill="white" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 512 512"><path d="M112 160V64c0-8.8 7.2-16 16-16H357.5c4.2 0 8.3 1.7 11.3 4.7l26.5 26.5c3 3 4.7 7.1 4.7 11.3V160h48V90.5c0-17-6.7-33.3-18.7-45.3L402.7 18.7C390.7 6.7 374.5 0 357.5 0H128C92.7 0 64 28.7 64 64v96h48zm16 208H384v96H128V368zm-16-48c-17.7 0-32 14.3-32 32H48V256c0-8.8 7.2-16 16-16H448c8.8 0 16 7.2 16 16v96H432c0-17.7-14.3-32-32-32H112zm320 80h48c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64V368c0 17.7 14.3 32 32 32H80v80c0 17.7 14.3 32 32 32H400c17.7 0 32-14.3 32-32V400z"></path></svg>列印頁面</div> <div class="flex-group"> <a href="/xml/xml_processors.htm"> <div class="button button--neutral"> <svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16" fill="none"><path d="M1.03117 8.48836C0.64065 8.09783 0.64065 7.46467 1.03117 7.07414L7.39514 0.710183C7.78566 0.319658 8.41883 0.319658 8.80935 0.710183C9.19987 1.10071 9.19987 1.73387 8.80935 2.1244L3.15249 7.78125L8.80935 13.4381C9.19987 13.8286 9.19987 14.4618 8.80935 14.8523C8.41882 15.2428 7.78566 15.2428 7.39513 14.8523L1.03117 8.48836ZM3.12109 8.78125L1.73828 8.78125L1.73828 6.78125L3.12109 6.78125L3.12109 8.78125Z" fill="black"></path></svg> 上一頁 </div> </a> <a href="/xml/xml_useful_resources.htm"> <div class="button ">下一頁 <svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16" fill="none"><path d="M8.87117 8.48836C9.26169 8.09783 9.26169 7.46467 8.87117 7.07414L2.50721 0.710183C2.11668 0.319658 1.48352 0.319658 1.09299 0.710183C0.70247 1.10071 0.70247 1.73387 1.09299 2.1244L6.74985 7.78125L1.093 13.4381C0.702471 13.8286 0.702471 14.4618 1.093 14.8523C1.48352 15.2428 2.11668 15.2428 2.50721 14.8523L8.87117 8.48836ZM6.78125 8.78125L8.16406 8.78125L8.16406 6.78125L6.78125 6.78125L6.78125 8.78125Z" fill="white"></path></svg> </div> </a></div> </div> <div class="bottom-library-ads mt" style="margin:5px;"> <div class="google-bottom-ads" id="google-bottom-ads" style="height:450px;"> <div>廣告</div> <div> <div id="ezoic-pub-ad-placeholder-131"></div> <div id="ezoic-pub-ad-placeholder-135"></div> <script> ezstandalone.cmd.push(function() { var width = window.innerWidth; if( width <= 768 ){ ezstandalone.showAds(135); document.getElementById("ezoic-pub-ad-placeholder-131").remove(); document.getElementById("google-right-ads").remove(); }else{ ezstandalone.showAds(131); document.getElementById("ezoic-pub-ad-placeholder-135").remove(); } }); </script> </div> </div> </div> </div> <div> <div class="data-sticky" id="google-right-ads"> <div class="google-right-ad" style="margin: 0px auto !important;margin-top:5px;min-height:280px!important"> <div id="ezoic-pub-ad-placeholder-127"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(127); }); </script> </div> <div class="google-right-ad" style="margin-top:16px;min-height:280px!important"> <div id="ezoic-pub-ad-placeholder-128"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(128); }); </script> </div> <div class="google-right-ad" style="margin-top:16px;margin-bottom:15px;min-height:600px!important"> <div id="ezoic-pub-ad-placeholder-129"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(129); }); </script> </div> </div> </div> </div> </div> </main> <footer class="footer bg-neutral-800"> <div class="container"> <div> <h5>TOP TUTORIALS</h5> <ul> <li><a href="/python/index.htm" title="Python Tutorial">Python Tutorial</a></li> <li><a href="/java/index.htm" title="Java Tutorial">Java Tutorial</a></li> <li><a href="/cplusplus/index.htm" title="C++ Tutorial">C++ Tutorial</a></li> <li><a href="/cprogramming/index.htm" title="C Programming Tutorial">C Programming Tutorial</a></li> <li><a href="/csharp/index.htm" title="C# Tutorial">C# Tutorial</a></li> <li><a href="/php/index.htm" title="PHP Tutorial">PHP Tutorial</a></li> <li><a href="/r/index.htm" title="R Tutorial">R Tutorial</a></li> <li><a href="/html/index.htm" title="HTML Tutorial">HTML Tutorial</a></li> <li><a href="/css/index.htm" title="CSS Tutorial">CSS Tutorial</a></li> <li><a href="/javascript/index.htm" title="JavaScript Tutorial">JavaScript Tutorial</a></li> <li><a href="/sql/index.htm" title="SQL Tutorial">SQL Tutorial</a></li> </ul> </div> <div> <h5>TRENDING TECHNOLOGIES</h5> <ul> <li><a href="/cloud_computing/index.htm" title="Cloud Computing Tutorial">Cloud Computing Tutorial</a></li> <li><a href="/amazon_web_services/index.htm" title="Amazon Web Services Tutorial">Amazon Web Services Tutorial</a></li> <li><a href="/microsoft_azure/index.htm" title="Microsoft Azure Tutorial">Microsoft Azure Tutorial</a></li> <li><a href="/git/index.htm" title="Git Tutorial">Git Tutorial</a></li> <li> <a href="/ethical_hacking/index.htm" title="Ethical Hacking Tutorial">Ethical Hacking Tutorial</a></li> <li><a href="/docker/index.htm" title="Docker Tutorial">Docker Tutorial</a></li> <li><a href="/kubernetes/index.htm" title="Kubernetes Tutorial">Kubernetes Tutorial</a></li> <li><a href="/data_structures_algorithms/index.htm" title="DSA Tutorial">DSA Tutorial</a></li> <li><a href="/spring_boot/index.htm" title="Spring Boot Tutorial">Spring Boot Tutorial</a></li> <li><a href="/sdlc/index.htm" title="SDLC Tutorial">SDLC Tutorial</a></li> <li><a href="/unix/index.htm" title="Unix Tutorial">Unix Tutorial</a></li> </ul> </div> <div> <h5>CERTIFICATIONS</h5> <ul> <li><a href="/certification/business-analytics-certification-2023/index.asp" title="Business Analytics Certification">Business Analytics Certification</a></li> <li><a href="/certification/java-prime-pack/index.asp" title="Java & Spring Boot Advanced Certification">Java & Spring Boot Advanced Certification</a></li> <li><a href="/certification/data-science-advanced-certification/index.asp" title="Data Science Advanced Certification">Data Science Advanced Certification</a></li> <li><a href="/certification/cloud-computing-and-devops-advanced-certification/index.asp" title="Cloud Computing And DevOps">Cloud Computing And DevOps</a></li> <li><a href="/certification/advanced-certification-in-business-analytics/index.asp" title="Advanced Certification In Business Analytics">Advanced Certification In Business Analytics</a></li> <li><a href="/certification/artificial-intelligence-and-machine-learning-certification/index.asp" title="Artificial Intelligence And Machine Learning">Artificial Intelligence And Machine Learning</a></li> <li><a href="/certification/devops-certification/index.asp" title="DevOps Certification">DevOps Certification</a></li> <li><a href="/certification/game-development-prime-pack/index.asp" title="Game Development Certification">Game Development Certification</a></li> <li><a href="/certification/frontend-developer-certification/index.asp" title="Front-End Developer Certification">Front-End Developer Certification</a></li> <li><a href="/certification/aws-prime-pack/index.asp" title="AWS Certification Training">AWS Certification Training</a></li> <li><a href="/certification/complete-python-prime-pack/index.asp" title="Python Programming Certification">Python Programming Certification</a></li> </ul> </div> <div> <h5>COMPILERS & EDITORS</h5> <ul> <li><a href="/online_java_compiler.php" title="Online Java Compiler">Online Java Compiler</a></li> <li><a href="/online_python_compiler.php" title="Online Python Compiler">Online Python Compiler</a></li> <li><a href="/execute_golang_online.php" title="Online Go Compiler">Online Go Compiler</a></li> <li><a href="/compile_c_online.php" title="Online C Compiler">Online C Compiler</a></li> <li><a href="/compile_cpp_online.php" title="Online C++ Compiler">Online C++ Compiler</a></li> <li><a href="/online_csharp_compiler.php" title="Online C# Compiler">Online C# Compiler</a></li> <li><a href="/execute_php_online.php" title="Online PHP Compiler">Online PHP Compiler</a></li> <li><a href="/execute_matlab_online.php" title="Online MATLAB Compiler">Online MATLAB Compiler</a></li> <li><a href="/execute_bash_online.php" title="Online Bash Compiler">Online Bash Compiler</a></li> <li><a href="/execute_sql_online.php" title="Online SQL Compiler">Online SQL Compiler</a></li> <li><a href="/online_html_editor.php" title="Online Html Editor">Online Html Editor</a></li> </ul> </div> </div> <ul class="footer__list container"> <li><a href="/about/index.htm" title="ABOUT US">ABOUT US</a> | </li> <li><a href="/about/about_team.htm" title="OUR TEAM">OUR TEAM</a> | </li> <li><a href="/about/about_careers.htm" title="CAREERS">CAREERS</a> | </li> <li><a href="/job_search.php" title="JOBS">JOBS</a> | </li> <li><a href="/about/contact_us.htm" title="CONTACT US">CONTACT US</a> | </li> <li><a href="/about/about_terms_of_use.htm" title="TERMS OF USE">TERMS OF USE</a> | </li> <li><a href="/about/about_privacy.htm" title="PRIVACY POLICY">PRIVACY POLICY</a> | </li> <li><a href="/about/return_refund_policy.htm" title="REFUND POLICY">REFUND POLICY</a> | </li> <li><a href="/about/about_cookies.htm" title="COOKIES POLICY">COOKIES POLICY</a> | </li> <li><a href="/about/faq.htm" title="FAQ'S">FAQ'S</a></li> </ul> <div class="footer__socials container"> <img class="footer__logo" src="https://tutorialspoint.tw/static/images/logo-footer.svg" alt="tutorials point logo"> <div> <a rel="nofollow" target="_blank" href="https://#/tutorialspointindia" title="Follow us on Facebook"><i class="fab fa-2x fa-facebook"></i></a> <a target="_blank" href="https://twitter.com/tutorialspoint" rel="nofollow" title="Follow us on Twitter"><i class="fab fa-2x fa-x-twitter"></i></a> <a target="_blank" href="https://www.youtube.com/channel/UCVLbzhxVTiTLiVKeGV7WEBg" rel="nofollow" title="Follow us on Youtube"><i class="fab fa-2x fa-youtube"></i></a> <a target="_blank" href="https://www.linkedin.com/company/tutorialspoint/" rel="nofollow" title="Follow us on LinkedIn"><i class="fab fa-2x fa-linkedin"></i></a> <a target="_blank" href="https://www.instagram.com/tutorialspoint_/" rel="nofollow" title="Follow us on Instagram"><i class="fab fa-2x fa-instagram"></i></a> </div> <div class="flex-group"> <button class="button-reset"><a href="https://play.google.com/store/apps/details?id=com.tutorialspoint.onlineviewer" target="_blank" title="Download Android App" rel="nofollow"><img src="https://tutorialspoint.tw/static/images/googleplay.svg" alt="Download Android App"></a></button> <button class="button-reset"><a href="https://itunes.apple.com/us/app/tutorials-point/id914891263?ls=1&mt=8" target="_blank" title="Download IOS App" rel="nofollow"><img src="https://tutorialspoint.tw/static/images/appstore.svg" alt="Download IOS App"></a></button> </div> </div> <div class="footer__legal-wrapper"> <div class="footer__legal ff-nunito"> <p> </p><p class="">Tutorials Point is a leading Ed Tech company striving to provide the best learning material on technical and non-technical subjects.</p> <p></p> <p class="footer__copyright ">© Copyright 2024. All Rights Reserved.</p> </div> </div> </footer> <script src="/static/js/lib-script.js?v12.43"></script> <script src="https://#/gsi/client" async="" defer=""></script> <script> function addParagraphs(ind) { let techLinks =[["Python","JavaScript","Spring Boot","Java","Linux/Unix","C#","Data Science","MySQL","Artificial Intelligence","SQL"], ["https://tutorialspoint.tw/certification/complete-python-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=python_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/javascript-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=javascript_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/ultimate-guide-to-java-and-spring-boot-for-2022/index.asp?utm_source=tutorialspoint&utm_medium=java_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/ultimate-guide-to-java-and-spring-boot-for-2022/index.asp?utm_source=tutorialspoint&utm_medium=spring_boot_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/linux-system-administrator-certification/index.asp?utm_source=tutorialspoint&utm_medium=unix_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/chash-and-net-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=csharp_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/data-science-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=data_science_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/mysql-technologies-pack/index.asp?utm_source=tutorialspoint&utm_medium=mysql_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/artificial-intelligence-and-machine-learning-certification/index.asp?utm_source=tutorialspoint&utm_medium=artificial_intelligence_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.tw/certification/mysql-technologies-pack/index.asp?utm_source=tutorialspoint&utm_medium=sql_tutorial_3p&utm_campaign=internal"]] var p2 = ''; if(ind>=0){ p2 = p2 + '<a style="text-decoration:none;" href="' + techLinks[1][ind] +'" target="_blank" ><p class="prmt_ad">Learn <strong>'+ techLinks[0][ind] + '</strong> in-depth with real-world projects through our <strong>' + techLinks[0][ind] + ' certification course</strong>. Enroll and become a certified expert to boost your career.</p></a>'; } else{ p2 = p2 + '<a href="https://tutorialspoint.tw/latest/courses?utm_source=tutorialspoint&utm_medium=tutorials_3p&utm_campaign=internal" style="text-decoration:none;" target="_blank"><p class="prmt_ad">Explore our <strong>latest online courses</strong> and learn new skills at your own pace. Enroll and become a certified expert to boost your career.</p></a>'; } $(p2).insertBefore($('.tutorial-content h2').eq(2)); } $(document).ready(function() { var url= window.location.href.toLowerCase(); if(url.indexOf('python') > -1){ addParagraphs(0); } else if(url.indexOf('javascript') > -1){ addParagraphs(1); } else if(url.indexOf('spring_boot') > -1){ addParagraphs(2); } else if(url.indexOf('java') > -1){ addParagraphs(3); } else if((url.indexOf('unix') > -1)||(url.indexOf('linux') > -1)){ addParagraphs(4); } else if((url.indexOf('csharp') > -1)||(url.indexOf('chash') > -1)){ addParagraphs(5); } else if(url.indexOf('data_science') > -1){ addParagraphs(6); } else if(url.indexOf('mysql') > -1){ addParagraphs(7); } else if((url.indexOf('artificial_intelligence') > -1)||(url.indexOf('artificial-intelligence') > -1)){ addParagraphs(8); } else if(url.indexOf('sql') > -1){ addParagraphs(9); } else{ addParagraphs(-1); } }); </script> <script> if(getCookie('user_id') == '' || getCookie('user_id') == null){ window.onload = function() { initializeGoogleOneTap(); }; } </script> <script src="https://tutorialspoint.tw/fontawesome/js/all.min.js?v2.9"></script> <script src="https://#/cmp.min.js" data-cfasync="false"></script> <script async="" src="/static/js/ezoic-ad-inserter.js?v4.2"></script> <script async="" src="https://#/gtag/js?id=G-EX9ZP4VY84"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-EX9ZP4VY84'); </script> <!-- New Facebook Pixel Code --> <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window,document,'script', 'https://#/en_US/fbevents.js'); fbq('init', '854536859149047'); fbq('track', 'PageView'); </script> <!-- End facebook Pixel Code --> <footer style="margin: 2em 2em 4em; font-size: small; text-align: center;"> © <script>document.write(new Date().getFullYear() + ' ' + location.host)</script>. All rights reserved. </footer></body></html>