Я анализирую XML-файл, используя libxmljs и .get () всегда возвращает первого потомка

1

Я рассматривал этот код часами, и я не могу заставить его работать, и я не знаю, почему.

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 каждый узел может иметь разные дочерние элементы.

Спасибо!

Теги:
libxml-js

2 ответа

0
Лучший ответ

Вы хотите относительные XPaths.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню