迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > JavaScript >

使用 JavaScript 通过 XPath 获取元素 - 示例

作者:迹忆客 最近更新:2022/11/27 浏览次数:

使用 document.evaluate() 方法通过 XPath 获取元素。 该方法根据提供的 XPath 表达式和提供的参数返回 XPathResult。

以下是本文示例的 HTML。

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>

  <body>
    <div>
      <p>Hello world</p>
    </div>
    <div>
      <p>Apple, Banana, Kiwi</p>
    </div>

    <script src="index.js"></script>
  </body>
</html>

这是相关的 JavaScript。

// ✅ Get specific `p` element
const firstP = document.evaluate(
  '/html/body/div[2]/p',
  document,
  null,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null,
).singleNodeValue;

console.log(firstP); // 👉️ p
console.log(firstP.textContent); // 👉️ "Apple, Banana, Kiwi"

// -----------------------
// ✅ Get all P elements
const allParagraphs = document.evaluate(
  '/html/body//p',
  document,
  null,
  XPathResult.ANY_TYPE,
  null,
);

console.log(allParagraphs);

let currentParagraph = allParagraphs.iterateNext();

while (currentParagraph) {
  console.log(currentParagraph.textContent);
  currentParagraph = allParagraphs.iterateNext();
}

我们使用 document.evaluate 方法来获取基于 XPath 表达式的 XPathResult。

第一个示例显示如何获取单个节点,而第二个示例获取节点集合并对其进行迭代。

document.evaluate 方法采用以下参数:

  1. xpathExpression - 要计算的 XPath
  2. contextNode - 查询的上下文节点(通常是文档)
  3. namespaceResolver - 在处理 HTML 文档时应该为 null
  4. resultType - 要返回的 XPathResult 的类型。
  5. result - 应该为空

请注意 ,在第一个示例中,我们访问了 XPathResult 对象的 singleNodeValue 属性。

// ✅ Get specific `p` element
const firstP = document.evaluate(
  '/html/body/div[2]/p',
  document,
  null,
  XPathResult.FIRST_ORDERED_NODE_TYPE,
  null,
).singleNodeValue;

console.log(firstP); // 👉️ p
console.log(firstP.textContent); // 👉️ "Apple, Banana, Kiwi"

singleNodeValue 属性返回第一个找到的与 XPath 表达式匹配的节点。

如果节点集为空,这将评估为 null。

示例中要注意的另一件事是,我们指定了 XPathResult.FIRST_ORDERED_NODE_TYPE 的结果类型。

如果查看 XPath 结果类型表,该结果类型会返回与提供的 XPath 表达式匹配的任何单个节点。

在第二个示例中,我们使用 XPath 表达式获取文档中的所有 p 元素并迭代结果。

// ✅ Get all P elements
const allParagraphs = document.evaluate(
  '/html/body//p',
  document,
  null,
  XPathResult.ANY_TYPE,
  null,
);

let currentParagraph = allParagraphs.iterateNext();

while (currentParagraph) {
  // 👇️ "Hello world", "Apple, Banana, Kiwi"
  console.log(currentParagraph.textContent);

  currentParagraph = allParagraphs.iterateNext();
}

这次我们将 XPAthResult.ANY_TYPE 设置为结果类型,它返回所提供的 XPath 表达式的任何类型结果。

返回的 XPathResult 对象是一组匹配节点,其行为类似于迭代器。

我们可以使用 XPathResult 对象的 iterateNext() 方法访问各个节点。

一旦我们遍历了所有节点,iterateNext() 方法将返回 null

请注意 ,修改节点会使迭代器失效。 修改节点后,尝试迭代结果会产生错误。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便