如何用Ruby和Nokogiri解析USPTO XML文件?

时间:2014-05-16 17:30:52

标签: ruby xml xml-parsing nokogiri

我一整天都试图弄清楚如何解析USPTO bulk XML files。我试图下载one这些文件,解压缩然后运行:

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

但它似乎只加载第一个元素,而不是所有专利(在该文件中只有几千个)

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您链接到的文件(可能是其他文件)不是有效的XML,因为它们没有根元素。来自Wikipedia

  

每个XML文档只有一个根元素

如果您查看错误(由Arup Rakshit建议),Nokogiri会对此进行暗示,详见the documentation

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声明。

或者,您可以预处理文件并将其拆分为组成的,格式正确的文档。一次解析650MB文档非常缓慢且占用大量内存。