解析和序列化 XML

有時,您可能需要解析 XML 內容並將其轉換為 DOM 樹,或者相反,將現有的 DOM 樹序列化為 XML。在本文中,我們將介紹 Web 平臺提供的物件,以簡化序列化和解析 XML 的常見任務。

XMLSerializer

序列化 DOM 樹,將其轉換為包含 XML 的字串。

DOMParser

透過解析包含 XML 的字串來構建 DOM 樹,根據輸入資料,相應地返回 XMLDocumentDocument

fetch()

從 URL 載入內容。XML 內容將作為文字字串返回,您可以使用 DOMParser 進行解析。

XMLHttpRequest

fetch() 的前身。與 fetch() API 不同,XMLHttpRequest 可以透過其 responseXML 屬性將資源作為 Document 返回。

XPath

一種用於建立包含 XML 文件特定部分地址的字串,並根據這些地址定位 XML 節點的技術。

建立 XML 文件

使用以下方法之一建立 XML 文件(它是 Document 的例項)。

將字串解析為 DOM 樹

此示例使用 DOMParser 將字串中的 XML 片段轉換為 DOM 樹。

js
const xmlStr = '<q id="a"><span id="b">hey!</span></q>';
const parser = new DOMParser();
const doc = parser.parseFromString(xmlStr, "application/xml");
// print the name of the root element or error message
const errorNode = doc.querySelector("parsererror");
if (errorNode) {
  console.log("error while parsing");
} else {
  console.log(doc.documentElement.nodeName);
}

將 URL 可定址資源解析為 DOM 樹

使用 fetch

以下是讀取 URL 可定址 XML 檔案並將其解析為 DOM 樹的示例程式碼。

js
fetch("example.xml")
  .then((response) => response.text())
  .then((text) => {
    const parser = new DOMParser();
    const doc = parser.parseFromString(text, "text/xml");
    console.log(doc.documentElement.nodeName);
  });

此程式碼將資源作為文字字串獲取,然後使用 DOMParser.parseFromString() 構建一個 XMLDocument

如果文件是 HTML,則上述程式碼將返回一個 Document。如果文件是 XML,則生成的物件實際上是 XMLDocument。這兩種型別本質上是相同的;區別很大程度上是歷史原因,儘管區分它們也有一些實際的好處。

注意:實際上還有一個 HTMLDocument 介面,但它不一定是獨立的型別。在某些瀏覽器中是,而在另一些瀏覽器中是 Document 介面的別名。

序列化 XML 文件

給定一個 Document,您可以使用 XMLSerializer.serializeToString() 方法將文件的 DOM 樹序列化回 XML。

使用以下方法序列化上一節中建立的 XML 文件的內容。

將 DOM 樹序列化為字串

首先,按照《使用文件物件模型》中的描述建立 DOM 樹。或者,使用從 fetch() 獲取的 DOM 樹。

要將 DOM 樹 doc 序列化為 XML 文字,請呼叫 XMLSerializer.serializeToString()

js
const serializer = new XMLSerializer();
const xmlStr = serializer.serializeToString(doc);

序列化 HTML 文件

如果您的 DOM 是 HTML 文件,您可以使用 serializeToString() 進行序列化,但還有另一個許多人認為更簡單的方法:使用 Element.innerHTML 屬性(如果您只需要指定節點的子節點)或 Element.outerHTML 屬性(如果您需要節點及其所有子節點)。

js
const docInnerHtml = document.documentElement.innerHTML;

結果,docInnerHtml 是一個包含文件內容的 HTML 的字串;也就是說,<body> 元素的 [內容]。

您可以使用此程式碼獲取對應於 <body> 及其子節點的 HTML。

js
const docOuterHtml = document.documentElement.outerHTML;

另見