这是一整天,我试图找出如何解析USPTO批量XML文件。我试着下载其中一个文件,解压缩,然后运行:
Nokogiri::XML(File.open('ipg140513.xml'))
但它似乎只加载第一个元素,而不是所有的专利(在该文件中有几千个专利)
我做错了什么?
您链接到的文件和其他文件都不是有效的XML,因为它们没有根元素。从维基百科:
每个XML文档只有一个根元素。
Nokogiri暗示了这一点,如果你看一下错误(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声明。
或者,您可以预处理文件并将其分割为其组成的、格式正确的文档。一次性解析一个650MB的文档非常慢,而且占用大量内存。