NodeJS XPath.select 表达式

Kar*_*sus 3 xpath node.js

我在node.js应用程序中使用xpath,但我无法弄清楚witch是在我的dom中选择某些节点的正确表达式。

我已经安装: https: //www.npmjs.com/package/xpath

这是我的 var 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>
Run Code Online (Sandbox Code Playgroud)

这是我的js代码

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

但结果是-->[];

根据文档,这个表达式“//loc”必须选择所有“loc”节点。但不工作。我无法选择任何东西。但如果我选择全部(“//*”),则此操作有效。

zx4*_*485 5

您的整个 XML 文件位于命名空间中。第一行

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ...
Run Code Online (Sandbox Code Playgroud)

设置所有元素的默认命名空间,从而设置loc元素的默认命名空间。所以要么定义一个命名空间

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

并在表达式中使用它//ns0:loc。或者使用谓词表达式
忽略元素上的所有名称空间,例如loc

//*[local-name()='loc']
Run Code Online (Sandbox Code Playgroud)