Jsdom: рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА XPath рдХреНрд╡реЗрд░реА рдЕрдкрд░ рдХреЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдорд╛рд░реНрдЪ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА:

  • Node.js рд╕рдВрд╕реНрдХрд░рдг: 8.9.1
  • jsdom рд╕рдВрд╕реНрдХрд░рдг: 14.0.0

JSDOM рдХреЗ DOMParser рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдХреНрд╡реЗрд░реА/рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XPath рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрд╡реЗрд░реА рдХреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рднрд╛рдЧ рдХреЛ рдХреЗрд╕ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдкрд░ рдХреЗрд╕ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

<?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) рдЬрд┐рд╕реЗ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ рдЕрд▓рдЧ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Saxes рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реНрддрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЧреБрдг рдЙрдирдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддреЗ рд╣реИрдВ)ред рдпрд╣ 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 рдХреНрд╡реЗрд░реА рдХреЗрд╕ рд╕реЗрдВрд╕рд┐рдЯрд┐рд╡ рд╣реИ рдФрд░ рдЕрдкрд░ рдХреЗрд╕ рдХреИрд░реЗрдХреНрдЯрд░ рд╡рд╛рд▓реЗ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддреА рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдордиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рд╣рд╛рде рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ xpath рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рдмрдирд╛рдП рд░рдЦрд╛ рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рд░реНрдЧ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕реНрдкреЙрдЯ-рдлрд┐рдХреНрд╕ рдкреАрдЖрд░ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

рд╣рд╛рдп, рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕