【问题标题】:How to treat child nodes using libxmljs (Node.js)如何使用 libxmljs (Node.js) 处理子节点
【发布时间】:2011-09-25 16:57:56
【问题描述】:

当我尝试使用 libxmljs 解析以下 xml 时,我感到困惑:

标题 1标题> 总结1总结> 结果> 标题 2标题> 总结2总结> 结果> 结果集>

我尝试了以下代码:

var libxmljs = require("libxmljs");
var xmlDoc = libxmljs.parseXmlFile("sample.xml");
xmlDoc.root().childNodes().length; // 5

我认为第三行的长度属性应该是 2, 因为有 2 个 Result 节点,它们是根节点的子节点。

顺便说一句,我检查了每个元素,例如:

xmlDoc.root().childNodes()[0].get("Title").text(); // TypeError: Cannot call method 'text' of undefined
xmlDoc.root().childNodes()[1].get("Title").text(); // Title 1
xmlDoc.root().childNodes()[2].get("Title").text(); // TypeError: Cannot call method 'text' of undefined
xmlDoc.root().childNodes()[3].get("Title").text(); // Title 2
xmlDoc.root().childNodes()[4].get("Title").text(); // TypeError: Cannot call method 'text' of undefined

为什么会有一些不相关的子节点?提前致谢!

(我的 libxmljs 版本是 0.4.2)

【问题讨论】:

  • 听起来像是将空格解析为子节点。尝试删除输入 xml 中的空格
  • 谢谢!但是删除空格和换行符并没有改变这种情况。
  • 对不起,雷诺斯。你写的是对的。删除空格实际上很顺利。谢谢!

标签: javascript xml node.js libxml2


【解决方案1】:

如果您无法删除空格,您有两个简单的解决方案:

在使用之前检查每个节点的类型:

xmlDoc.root().childNodes()[0].type() // 'text'

将是 'text''element'。您可以忽略文本。

最好还是使用 xpath 系统。因此,您可以找到所有实际元素:

xmlDoc.find('*')[0].get('Title').text() // 'Title 1'

或者您甚至可以直接通过 xpath 访问标题节点:

xmlDoc.find('*/Title')[0].text() // 'Title 1'

【讨论】:

    【解决方案2】:

    Raynos 是正确的。您看到的 5 个节点是 .试试这个版本的 xml。

    <?xml version="1.0" encoding="UTF-8"?>
    <ResultSet><Result><Title>Title 1</Title><Summary>Summary 1</Summary></Result><Result><Title>Title 2</Title><Summary>Summary 2</Summary></Result></ResultSet>
    

    这不会返回任何内容,因为第一个子节点是没有子节点的文本节点。

    xmlDoc.root().childNodes()[0].get("Title");
    

    大多数 xml 库都覆盖了细节并做“明智的事情”,比如只返回元素节点。 Libxmljs 是对 libxml2 库的松散包装。但是 libxml2 并没有这样做。所以它有助于理解 libxml2 DOM 模型。在解析为 DOM 的 XML 标准中,文本节点是有效的子节点,就像元素一样。还有实体、CDATA 等。你必须明确地处理这些。尝试检查 node.type() 以查看您正在处理的节点类型。只过滤元素很容易。

    【讨论】:

    • 非常感谢!我修改了你写的 XML,我可以得到我期望的值。而关于libxml2的信息也对我帮助很大!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2020-06-23
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多