我正在使用 libxmljs 和 .get() 解析一个 XML 文件,总是 returns 第一个 child
I am parsing a XML file using libxmljs and .get() always returns the first child
我已经查看这段代码好几个小时了,但我无法让它工作,我也不知道为什么。
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());
我期望的是进入控制台
第一个Child
第二 Child
第三个Child
但是我得到的是:
第一个Child
首先 Child
首先Child
我发现 .get('//grandchild') returns 代码中的所有孙子,尽管它只是从一个节点调用的。我不能将它与索引一起使用,因为在我的实际 XML 每个节点都可以有不同的子节点。
谢谢!
您需要相对 XPath。
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
我已经查看这段代码好几个小时了,但我无法让它工作,我也不知道为什么。
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());
我期望的是进入控制台
第一个Child 第二 Child 第三个Child
但是我得到的是:
第一个Child 首先 Child 首先Child
我发现 .get('//grandchild') returns 代码中的所有孙子,尽管它只是从一个节点调用的。我不能将它与索引一起使用,因为在我的实际 XML 每个节点都可以有不同的子节点。
谢谢!
您需要相对 XPath。
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