我一整天都试图弄清楚如何解析USPTO bulk XML files。我试图下载one这些文件,解压缩然后运行:
Nokogiri::XML(File.open('ipg140513.xml'))
但它似乎只加载第一个元素,而不是所有专利(在该文件中只有几千个)
我做错了什么?
答案 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文档非常缓慢且占用大量内存。