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/
根据要求。
我有一个 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/
根据要求。