gpt4 book ai didi

javascript - 当给定 xmlns 时,DOM XPath 查询不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 02:41:02 24 4
gpt4 key购买 nike

在 Firefox JavaScript 控制台中:

parser = new DOMParser();

foo = parser.parseFromString('<foo></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> [object Element]

foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> null

res = foo.evaluate("*[1]", foo, null, 0, null);
res.iterateNext();
> [object Element]

如果 XML 文档不包含 xmlns,它会被正确解析和查询。如果是这样,我们将无法再按标签和属性名称进行查询。但是,使用通配符和索引进行查询确实有效。在 Chrome 中观察到同样的情况。创建和使用默认 namespace 解析器以及自定义 namespace 解析器都无济于事。有什么建议吗?

最佳答案

在处理 namespace 时,您必须做两件事。

  1. 在您的 XPath 表达式中使用命名空间。由于您的文档中没有前缀,我只选择了 ns - 最好使用真实世界代码中更具描述性的内容。
  2. 添加命名空间解析器,它实际上是一个函数,作为第三个参数传递给 evaluate(...)

将所有内容放在一起,您的代码将如下所示:

parser = new DOMParser();
foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/ns:foo", foo, function(prefix) {
if (prefix === 'ns') {
return 'http://foo.bar.baz/quux';
} else {
return null
}
}, 0, null);
res.iterateNext();

按预期返回:

<foo xmlns="http://foo.bar.baz/quux"></foo>

您的第三个查询有结果,因为您使用的是忽略命名空间的通配符匹配器 *。另一种不注册命名空间但使用通配符匹配器的 XPath 表达式是

//*[local-name() = 'foo']

关于javascript - 当给定 xmlns 时,DOM XPath 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19438596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com