如何使用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'
- 通过Passport OAuthstream传递URL参数
- 如何包含Node.js的Amazon EC2库?
- MarkLogic – JavaScript node.js客户端API – QueryBuilder – 在集合之间join
- 如何在Express 4.0中发送Flash消息?
- 最大调用堆栈大小超过了Node.JS WebCrawler
- 为什么分配Int8Array时Node有时会挂起?
- 在Node.js中从多个stream收集数据
- React-如何在渲染服务器端时保存javascript
- 在打字稿中访问Nodejsstream的highWaterMark属性给出:“Property'_readableState'不存在”错误