2014-05-16 90 views
1

我試圖弄清楚如何解析USPTO bulk XML files已經過了整整一天。我試圖下載這些文件的one,解壓縮,然後運行:如何使用Ruby和Nokogiri解析USPTO XML文件?

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

但它似乎只加載的第一要素,並不是所有的專利(在該文件中有幾千)

我究竟做錯了什麼?

+0

如果該文件包含數千條記錄,那麼編寫SAX解析器可能會更好/更智能/更安全(當然使用Nokogiri)。默認情況下,Nokogiri使用DOM解析器,這意味着在解析發生之前將整個XML文檔加載到內存中,如果XML足夠大,這可能會削弱機器。 –

回答

3

您鏈接到的文件(可能是其他文件)不是有效的XML文件,因爲它們沒有根元素。從Wikipedia

每個XML文檔都只有一個單一根元素

引入nokogiri在這一點,如果你看一下錯誤(由Arup Rakshit建議),詳見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文件是非常緩慢和內存密集型的。

+0

你的回答很好,但是* Nokogiri *本身可以告訴它,它遇到了什麼錯誤。看看這個 - http://nokogiri.org/tutorials/ensuring_well_formed_markup.html –

+0

感謝您的建議,@ArupRakshit,我已經更新了答案。 –

+1

+1 ...先生。 Nokogiri非常聰明嗎? :) –