3

在 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 中也观察到了同样的情况。创建和使用默认命名空间解析器以及自定义命名空间解析器并没有帮助。有什么建议么?

4

1 回答 1

2

在处理命名空间时,您必须做两件事。

  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']
于 2013-10-18T08:14:36.500 回答