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

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

 <?xml version =“1.0”encoding =“UTF-8”?>
 <结果集>
     <结果>
         <标题>标题1 </标题>
         <Summary> Summary 1 </ Summary>
     </结果>
     <结果>
         <标题>标题2 </标题>
         <Summary> Summary 2 </ Summary>
     </结果>
 </结果集>

我试过下面的代码:

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

我认为第三行的length属性应该是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)

雷诺斯是正确的。 你看到的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模型。 在parsing为DOM的XML标准中,文本节点就像元素一样是有效的孩子。 也有实体,CDATA等,你必须明确地处理这些。 尝试检查node.type()来查看正在处理的节点types。 只过滤元素很容易。

如果你不能删除空格,你有两个简单的解决scheme:

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

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

将是'text''element' 。 你可以忽略文字。

更好的是使用xpath系统。 你可以find所有的实际元素:

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

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

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