Node.js XPath 示例?

Node.js XPath example?

我有一个 XML 数据,要阅读我正在使用 'xpath' 和 'xmldom'。我正在获取 relativePath 值,但它只给出第一个值 (/abc/) 3 次。我无法获得其他价值。

var xpath = require('xpath')
var dom = require('xmldom').DOMParser

var le = `
<content>
<data>
<content-item>
<relativePath>/abc/</relativePath>
<text>abc</text>
<leaf>false</leaf>
<lastModified>2018-10-16</lastModified>
</content-item>
<content-item>
<relativePath>/defghi/</relativePath>
<text>defghi</text>
<leaf>false</leaf>
<lastModified>2018-06-23</lastModified>
</content-item>
<content-item>
<relativePath>/jklmn/</relativePath>
<text>jklmn</text>
<leaf>false</leaf>
<lastModified>2019-02-27</lastModified>
</content-item>`;

var doc = new dom().parseFromString(le);
var nodes = xpath.select("//content-item", doc); 
  nodes.forEach( (n, i) => {
    var title = xpath.select("string(//relativePath)", n);

    console.log(title);

  });

最终输出:

/abc/
/abc/
/abc/

问题是您正在获取节点集的字符串值,根据定义,它是第一个节点的字符串值。遍历 JavaScript 中选定的节点,只取每个单独的字符串值,而不是对整个节点集共同调用 XPath string() 函数。

还不清楚为什么您需要一个嵌套循环而不是一个遍历所有 relativePath 元素的循环,但这也许是将完整程序缩减为已发布示例的产物。在任何情况下,如果您希望将内部循环限制为仅当前 content-item 上下文节点下的那些 relativePath 元素,请改用 .//relativePath

最后,你的 XML 格式不正确。

Node.js xmldom/xpath 工作示例

我已经在下面的示例中修复了上述问题(并缩进了 XML 以便于阅读):

var xpath = require('xpath')
var dom = require('xmldom').DOMParser

var le = `
<content>
  <data>
    <content-item>
      <relativePath>/abc/</relativePath>
      <text>abc</text>
      <leaf>false</leaf>
      <lastModified>2018-10-16</lastModified>
    </content-item>
    <content-item>
      <relativePath>/defghi/</relativePath>
      <text>defghi</text>
      <leaf>false</leaf>
      <lastModified>2018-06-23</lastModified>
    </content-item>
    <content-item>
      <relativePath>/jklmn/</relativePath>
      <text>jklmn</text>
      <leaf>false</leaf>
      <lastModified>2019-02-27</lastModified>
    </content-item>
  </data>
</content>`;

var doc = new dom().parseFromString(le);
var nodes = xpath.select("//relativePath", doc); 
nodes.forEach( (n, i) => {
  console.log(n.textContent);
});

输出

/abc/
/defghi/
/jklmn/

根据要求。