我parsingXML文件使用libxmljs和.get()总是返回第一个孩子

我一直在看这个代码几个小时,我不能让它工作,我不知道为什么。

var libxmljs = require("libxmljs"); var xml = '<?xml version="1.0" encoding="UTF-8"?>' + '<root>' + '<child foo="bar">' + '<grandchild>First Child</grandchild>' + '</child>' + '<child foo="bar">' + '<grandchild>Second child</grandchild>' + '</child>' + '<child foo="bar">' + '<grandchild>Third Child</grandchild>' + '</child>' + '<sibling>with content!</sibling>' + '</root>'; var xmlDoc = libxmljs.parseXml(xml); var childs = xmlDoc.find('//child'); for (var i = 0; i < childs.length; i++) console.log(childs[i].get('//grandchild').text()); 

我期望的是进入控制台

一孩二孩三孩

但是我得到的是:

第一个孩子第一个孩子

我发现.get('// grandchild')返回代码中的所有孙子,尽pipe它只是从一个节点调用。 我不能用于索引,因为在我的实际XML中,每个节点都可以有不同的孩子。

谢谢!

你需要相对的XPaths。

 for (var i = 0; i < childs.length; i++) console.log(childs[i].get('.//grandchild').text()); //---------------------------^ 

尝试这个

 const transform = require("camaro") const xml = '<?xml version="1.0" encoding="UTF-8"?>' + '<root>' + '<child foo="bar">' + '<grandchild>First Child</grandchild>' + '</child>' + '<child foo="bar">' + '<grandchild>Second child</grandchild>' + '</child>' + '<child foo="bar">' + '<grandchild>Third Child</grandchild>' + '</child>' + '<sibling>with content!</sibling>' + '</root>'; const { grandchildren } = transform(xml, { grandchildren: ['//grandchild', '.'] }) for (let i = 0; i < grandchildren.length; i++) { console.log(grandchildren[i]) } 

产量

 // First Child // Second child // Third Child