Как анализировать XML-файлы USPTO с помощью Ruby и Nokogiri?

Целый день я пытаюсь понять, как анализировать USPTO массовые XML-файлы. Я попытался загрузить один из этих файлов, распаковал его, а затем бежать:

Nokogiri::XML(File.open('ipg140513.xml'))

Но вроде загружается только первый элемент, а не все патенты (в том файле их несколько тысяч)

Что я делаю не так?


person liam.wonderstone    schedule 16.05.2014    source источник
comment
Если файл содержит тысячи записей, может быть лучше/умнее/безопаснее написать парсер SAX (используя, конечно, Nokogiri). По умолчанию Nokogiri использует синтаксический анализатор DOM, что означает, что весь XML-документ загружается в память до того, как произойдет синтаксический анализ, что может нанести вред машине, если XML достаточно велик.   -  person the Tin Man    schedule 17.05.2014


Ответы (1)


Файл, на который вы ссылаетесь, и, предположительно, другие, не являются допустимым 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
comment
Ваш ответ хорош, но Nokogiri сам может сказать, с какой ошибкой он столкнулся. Посмотрите это - nokogiri.org/tutorials/ensuring_well_formed_markup.html - person Arup Rakshit; 16.05.2014
comment
Спасибо за предложение, @ArupRakshit, я обновил ответ. - person Buck Doyle; 16.05.2014
comment
Спасибо Бак! Да, я пробовал с DocumentFragment, и мой ноутбук просто умер. Сейчас я пытаюсь понять, как разбить xml на несколько файлов, учитывая также, что мне нужны не все патенты в нем, а только некоторые из них. Я также искал, предоставляет ли USPTO XML-файлы для отдельных патентов, но ничего не нашел, только массовые почтовые индексы. - person liam.wonderstone; 16.05.2014