Jsdom: 解析的 XML 文档的 XPath 查询因大写属性而失败

创建于 2019-03-12  ·  3评论  ·  资料来源: jsdom/jsdom

基础信息:

  • Node.js 版本: 8.9.1
  • jsdom 版本: 14.0.0

当使用 XPath 查询/评估由 JSDOM 的 DOMParser 生成的 XML 文档时,查询的属性部分似乎被强制为小写,从而无法查询包含大写字符的属性。

例如,给定以下文档:

<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>
                                               ^-- capital F

//*[@Foo="bar"] (或//*[@foo="bar"] )的查询不返回任何匹配项,但是给定此文档而不是小写属性:

<?xml version="1.0" encoding="utf-8"?><example foo="bar"></example>
                                               ^-- lower case F

现在有了这个新文档, //*[@foo="bar"]以及等效的大写字母//*[@Foo="bar"] )成功地找到了匹配项。

我很久以前就发现了一个类似的问题(https://github.com/jsdom/jsdom/issues/651),该问题是通过引入 Saxes 来从 HTML 文档中分离解析 XML 文档来解决的,但是目前在解析级别一切似乎被正确解析(例如,属性保留其大小写)。 在 XPath 评估级别,查询似乎是小写的。

我尝试缩小可能发生错误的范围,并已到达https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

shouldLowerCase值设置为false修复了我的用例,但我不知道对 XPath 实现的其余部分有什么影响。

最小复制案例

const { JSDOM } = require("jsdom");

const dom = new JSDOM();

const domParser = new dom.window.DOMParser();
const doc = domParser.parseFromString('<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>', 'text/xml');
const result = doc.evaluate('//*[@Foo="bar"]', doc, null, XPathResult.ANY_TYPE, null);
const exampleNode = result.iterateNext();
console.log('Result:', exampleNode); // exampleNode is null

类似的代码在浏览器中的表现如何?

https://jsbin.com/qegifaqumi/2/edit?js ,控制台

XPath 查询区分大小写,可以匹配具有大写字符属性的节点。

x(ht)ml

最有用的评论

所有3条评论

很长一段时间以来,我们都有一个待办事项,用维护的第三方实现替换我们古老的手动 xpath 实现。 这可能是解决此问题的最佳途径,尽管通过测试进行现场修复 PR 也是可以接受的。

你好,有更新吗?

此页面是否有帮助?
0 / 5 - 0 等级