当我尝试使用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)
答案 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'