2014-12-11 55 views
0

我有一個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

回答

1

這可能是因爲當你試圖跳過它時,它已經讀取了節點。按照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