NodeJS XPath.select выражения - PullRequest
0 голосов
/ 26 июня 2018

Я использую xpath в приложении node.js, но не могу понять, что правильное выражение для выбора некоторых узлов в моем домике.

Я установил: https://www.npmjs.com/package/xpath

Это мой вар xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" 
        xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
  <url> 
    <loc>https://generic.net/it/diventa-promoter</loc>
    <xhtml:link 
        rel="alternate"
        hreflang="en"
        href="https://generic.net/en/become-promoter"
    />
    <image:image>
       <image:loc>https://generic.net/view/image/logo.jpg</image:loc>
       <image:caption>Logo</image:caption>
    </image:image>
    <image:image>
       <image:loc>https://generic.net/view/image/step_1.jpg</image:loc>
       <image:caption>xxx</image:caption>
    </image:image>
  </url>
  <url> 
    <loc>https://generic.net/it/accedi</loc> 
  </url>
  <url> 
    <loc>https://generic.net/it/aggiungi-il-tuo-brand</loc> 
    <image:image>
       <image:loc>https://generic.net/view/image/how_it_works_it.jpg</image:loc>
       <image:caption>zzz?</image:caption>
    </image:image>
  </url>
  <url> 
    <loc>https://generic.net/it/domande-frequenti-brand</loc> 
  </url>
  <url> 
    <loc>https://generic.net/it/domande-frequenti-rivenditori</loc> 
  </url>
</urlset>

А это мой код JS

var doc = new dom().parseFromString(xml);
var nodes = xpath.select("//loc", doc);
console.log(nodes);

Но результат -> [];

Согласно документации, это выражение "// loc" должно выбирать все узлы "loc". Но не работает. Я не могу ничего выбрать. Но если я выберу все ("// *"), эта работа.

1 Ответ

0 голосов
/ 26 июня 2018

Весь ваш XML-файл находится в пространстве имен. Первая строка

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ...

устанавливает пространство имен по умолчанию для всех элементов и, следовательно, для элемента loc. Так что либо определите пространство имен с помощью

var select = xpath.useNamespaces({"ns0": "http://www.sitemaps.org/schemas/sitemap/0.9"});

и используйте его в выражении //ns0:loc.
Или игнорируйте все пространства имен в элементах loc с выражением предиката, таким как

//*[local-name()='loc']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...