Я рассматривал этот код часами, и я не могу заставить его работать, и я не знаю, почему.
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 каждый узел может иметь разные дочерние элементы.
Спасибо!
Вы хотите относительные 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