解析和序列化 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;

另见