Файл, на который вы ссылаетесь, и, предположительно, другие, не являются допустимым XML, поскольку у них нет корневого элемента. Из Википедии:
Каждый XML-документ имеет ровно один единственный корневой элемент.
Нокогири намекает на это, если вы посмотрите на ошибки (предложено Arup Rakshit), как подробно описано в документации:
Nokogiri::XML(File.open("/Users/b/Downloads/ipg140513.xml")).errors # =>
# [
# #<Nokogiri::XML::SyntaxError: XML declaration allowed only at the start of the document>,
# #<Nokogiri::XML::SyntaxError: Extra content at the end of the document>
# ]
Файл выглядит как объединение ряда действительных XML-файлов, каждый из которых имеет <us-patent-grant/>
в качестве корневого элемента.
К счастью, Nokogiri может обработать этот недопустимый XML, если вы обрабатываете его как фрагмент документа. Попробуй это:
Nokogiri::XML::DocumentFragment.parse(File.read('ipg140513.xml')).select{|element| element.name == 'us-patent-grant'}
select
выбирает корневой узел каждого объединенного документа, игнорируя инструкции обработки и объявления DTD.
В качестве альтернативы вы можете предварительно обработать файл и разделить его на составляющие правильно отформатированные документы. Одновременный анализ документа размером 650 МБ довольно медленный и занимает много памяти.
person
Buck Doyle
schedule
16.05.2014