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,然后解析文件。但是,这种方法似乎效率很低。
这可能是因为当你试图跳过它时,它已经读取了节点。按照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解析器是解决方案的必需部分。考虑到这个限制,我删除了不会有帮助的链接。
感谢您的回答。这澄清了为什么我的尝试不成功。在调用'#read'方法之前如何跳过节点的其他想法? – diasks2 2014-12-11 02:12:18
也许你可以捕捉错误,然后调用'reader.next'?我不确定这是否可行,因为我没有这个库或一个代表性的XML文件来测试。 – 2014-12-11 02:15:49
还有一些[选项](http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Parser/Options.html)可以传递给可能有帮助的解析器。我认为最有趣的是“RECOVER”。 – 2014-12-11 02:21:42
你绝对需要使用SAX解析器吗? – 2014-12-11 01:59:02
在这种情况下,是的。 – diasks2 2014-12-11 02:05:14
啊,好的。这当然会使问题更具挑战性。感谢您的澄清。 – 2014-12-11 02:06:14