当使用 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 查询区分大小写,可以匹配具有大写字符属性的节点。
很长一段时间以来,我们都有一个待办事项,用维护的第三方实现替换我们古老的手动 xpath 实现。 这可能是解决此问题的最佳途径,尽管通过测试进行现场修复 PR 也是可以接受的。
你好,有更新吗?
最有用的评论
https://mobile.twitter.com/slicknet/status/782274190451671040