如何使用libxmljs处理子节点(Node.js)

时间:2011-06-30 05:54:29

标签: javascript xml node.js libxml2

当我尝试使用libxmljs解析后面的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>

我试过以下代码:

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)

2 个答案:

答案 0 :(得分:1)

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 libs会详细介绍细节并做“明智的事情”,比如只返回元素节点。 Libxmljs是一个围绕libxml2库的松散包装器。但是libxml2并没有这样做。因此有助于理解libxml2 DOM模型。在用于解析为DOM的XML标准中,文本节点就像元素一样是有效的子节点。还有实体,CDATA等。你必须明确地处理这些。尝试检查node.type()以查看您正在处理的节点类型。只过滤元素很容易。

答案 1 :(得分: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'