【问题标题】:How to parse USPTO XML files with Ruby and Nokogiri?如何使用 Ruby 和 Nokogiri 解析 USPTO XML 文件?
【发布时间】:2014-07-05 06:16:42
【问题描述】:

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

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

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

我做错了什么?

【问题讨论】:

  • 如果文件包含数千条记录,编写 SAX 解析器(当然使用 Nokogiri)可能会更好/更智能/更安全。默认情况下,Nokogiri 使用 DOM 解析器,这意味着在解析发生之前将整个 XML 文档加载到内存中,如果 XML 足够大,这可能会瘫痪机器。

标签: ruby xml xml-parsing nokogiri


【解决方案1】:

您链接到的文件以及可能的其他文件不是有效的 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 文件的串联,每个文件都有一个 &lt;us-patent-grant/&gt; 作为其根元素。

幸运的是,如果您将其作为文档片段处理,Nokogiri 可以处理此无效 XML。试试这个:

Nokogiri::XML::DocumentFragment.parse(File.read('ipg140513.xml')).select{|element| element.name == 'us-patent-grant'}

select 选择每个连接文档的根节点,忽略处理指令和 DTD 声明。

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

【讨论】:

  • 您的回答很好,但 Nokogiri 本身可以判断它遇到了什么错误。看这个 - nokogiri.org/tutorials/ensuring_well_formed_markup.html
  • 感谢@ArupRakshit 的建议,我已经更新了答案。
  • 谢谢巴克!是的,我尝试过使用 DocumentFragment,但我的笔记本电脑刚刚死机。现在我试图弄清楚如何将 xml 拆分为多个文件,同时考虑到我不需要其中的所有专利,而只需要其中的几个。我还搜索了 USPTO 是否为单个专利提供 xml 文件,但我找不到任何东西,只有批量 zips
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2013-03-19
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多