Ruby LibXML跳过大节点

问题描述:

我有一个xml文件,它有一个非常大的文本节点(> 10 MB)。读取文件时,是否可以跳过(忽略)该节点?Ruby LibXML跳过大节点

我试过如下:

reader = XML::Reader.io(path) 
while reader.read do 
    next if reader.name.eql?('huge-node') 
end 

但是,这仍然导致错误parser error : xmlSAX2Characters: huge text node

唯一的其他解决方案,我能想到的是先读取该文件作为一个字符串,删除巨大节点通过gsub,然后解析文件。但是,这种方法似乎效率很低。

+0

你绝对需要使用SAX解析器吗? – 2014-12-11 01:59:02

+0

在这种情况下,是的。 – diasks2 2014-12-11 02:05:14

+0

啊,好的。这当然会使问题更具挑战性。感谢您的澄清。 – 2014-12-11 02:06:14

这可能是因为当你试图跳过它时,它已经读取了节点。按照documentation#read方法:

reader.read -> nil|true|false 
Causes the reader to move to the next node in the stream, exposing its properties. 

Returns true if a node was successfully read or false if there are no more nodes to read. On errors, an exception is raised. 

您需要的节点跳过调用就可以了#read方法之前。我确信有很多方法可以做到这一点,但看起来这个库不支持XPath表达式,或者我会建议类似的东西。

编辑:该问题得到澄清,以便SAX解析器是解决方案的必需部分。考虑到这个限制,我删除了不会有帮助的链接。

+0

感谢您的回答。这澄清了为什么我的尝试不成功。在调用'#read'方法之前如何跳过节点的其他想法? – diasks2 2014-12-11 02:12:18

+0

也许你可以捕捉错误,然后调用'reader.next'?我不确定这是否可行,因为我没有这个库或一个代表性的XML文件来测试。 – 2014-12-11 02:15:49

+0

还有一些[选项](http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Parser/Options.html)可以传递给可能有帮助的解析器。我认为最有趣的是“RECOVER”。 – 2014-12-11 02:21:42