Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby和Nokogiri解析USPTO XML文件?_Ruby_Xml_Xml Parsing_Nokogiri - Fatal编程技术网

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

如何使用Ruby和Nokogiri解析USPTO XML文件?,ruby,xml,xml-parsing,nokogiri,Ruby,Xml,Xml Parsing,Nokogiri,我花了一整天的时间试图弄明白如何解析。我尝试下载这些文件,解压缩后运行: Nokogiri::XML(File.open('ipg140513.xml')) 但它似乎只加载第一个元素,而不是所有的专利(在该文件中有几千个) 我做错了什么?您链接到的文件以及其他文件可能都不是有效的XML,因为它们没有根元素。发件人: 每个XML文档只有一个根元素 如果您查看错误(建议的),Nokogiri会提示这一点,详情如下: select选择每个连接文档的根节点,忽略处理指令和DTD声明 或者,您可以预处理

我花了一整天的时间试图弄明白如何解析。我尝试下载这些文件,解压缩后运行:

Nokogiri::XML(File.open('ipg140513.xml'))
但它似乎只加载第一个元素,而不是所有的专利(在该文件中有几千个)


我做错了什么?

您链接到的文件以及其他文件可能都不是有效的XML,因为它们没有根元素。发件人:

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

如果您查看错误(建议的),Nokogiri会提示这一点,详情如下:

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


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

您的答案很好,但Nokogiri本身可以判断它遇到了什么错误。看看这个-谢谢你的建议,@ArupRakshit,我已经更新了答案。谢谢你,巴克!是的,我试过使用DocumentFragment,我的笔记本电脑死机了。现在,我正试图找出如何将xml拆分为多个文件,同时考虑到我并不需要所有的专利,只需要其中的几个。我还搜索了USPTO是否为单个专利提供了xml文件,但我找不到任何东西,只是批量zipsIf文件包含数千条记录,那么编写SAX解析器(当然使用Nokogiri)可能会更好/更智能/更安全。默认情况下,Nokogiri使用DOM解析器,这意味着在进行解析之前,整个XML文档都会加载到内存中,如果XML足够大,这可能会使机器瘫痪。
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>
# ]
Nokogiri::XML::DocumentFragment.parse(File.read('ipg140513.xml')).select{|element| element.name == 'us-patent-grant'}