【问题标题】:I am parsing a XML file using libxmljs and .get() always returns the first child我正在使用 libxmljs 解析 XML 文件,并且 .get() 总是返回第一个孩子
【发布时间】:2017-10-24 16:47:05
【问题描述】:

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

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 中,每个节点都可以有不同的子节点。

谢谢!

【问题讨论】:

    标签: javascript node.js libxml-js


    【解决方案1】:

    您需要相对的 XPath。

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

    【讨论】:

      【解决方案2】:

      试试这个

      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
      

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 2013-08-15
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2020-12-23
        • 1970-01-01
        相关资源
        最近更新 更多