2014-12-11 3 views
0

У меня есть xml-файл с очень большим текстовым узлом (> 10 МБ). При чтении файла можно ли пропускать (игнорировать) этот узел?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-парсер? –

+0

В этом случае да. – diasks2

+0

А, ок. Это, безусловно, делает проблему более сложной. Спасибо за разъяснения. –

ответ

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, или я бы предложил что-то подобное.

EDIT: Вопрос уточнен, так что синтаксический анализатор SAX является необходимой частью решения. Я удалил ссылки, которые не были бы полезны с учетом этого ограничения.

+0

Спасибо за ваш ответ. Это разъясняет, почему моя попытка не увенчалась успехом. Любые другие идеи о том, как пропустить узел до вызова метода '# read' на нем? – diasks2

+0

Возможно, вы смогли поймать ошибку, а затем вызвать 'reader.next'? Я не совсем уверен, что это сработает, потому что у меня нет этой библиотеки или репрезентативного XML-файла для тестирования. –

+0

Также есть несколько [вариантов] (http://xml4r.github.io/libxml-ruby/rdoc/classes/LibXML/XML/Parser/Options.html), которые вы можете передать парсеру, который может помочь. Я думаю, что наиболее интересным будет «ВОССТАНОВЛЕНИЕ». –

Смежные вопросы