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、console

XPathクエリでは大文字と小文字が区別され、大文字の属性を持つノードと照合できます。

x(ht)ml

最も参考になるコメント

全てのコメント3件

私たちは長い間、古い手巻きのxpath実装を、維持されているサードパーティの実装に置き換えるための作業を行ってきました。 これはおそらくこれを修正するための最良のルートですが、テストを使用したスポット修正PRも許容されます。

こんにちは、更新はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価