我正在使用libxmljs解析XML文件,而.get()总是返回第一个子节点

时间:2017-10-24 16:47:06

标签: javascript node.js libxml-js

我一直在看这段代码几个小时,我无法使它工作,我不知道为什么。

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')返回代码中的所有孙子,尽管它只是从一个节点调用。我不能将它与索引一起使用,因为在我的实际XML中,每个节点都可以有不同的子节点。

谢谢!

2 个答案:

答案 0 :(得分:0)

你想要相对的XPath。

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

答案 1 :(得分:0)

试试这个

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