我試圖弄清楚如何解析USPTO bulk XML files已經過了整整一天。我試圖下載這些文件的one,解壓縮,然後運行:如何使用Ruby和Nokogiri解析USPTO XML文件?
Nokogiri::XML(File.open('ipg140513.xml'))
但它似乎只加載的第一要素,並不是所有的專利(在該文件中有幾千)
我究竟做錯了什麼?
我試圖弄清楚如何解析USPTO bulk XML files已經過了整整一天。我試圖下載這些文件的one,解壓縮,然後運行:如何使用Ruby和Nokogiri解析USPTO XML文件?
Nokogiri::XML(File.open('ipg140513.xml'))
但它似乎只加載的第一要素,並不是所有的專利(在該文件中有幾千)
我究竟做錯了什麼?
您鏈接到的文件(可能是其他文件)不是有效的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文件是非常緩慢和內存密集型的。
你的回答很好,但是* Nokogiri *本身可以告訴它,它遇到了什麼錯誤。看看這個 - http://nokogiri.org/tutorials/ensuring_well_formed_markup.html –
感謝您的建議,@ArupRakshit,我已經更新了答案。 –
+1 ...先生。 Nokogiri非常聰明嗎? :) –
如果該文件包含數千條記錄,那麼編寫SAX解析器可能會更好/更智能/更安全(當然使用Nokogiri)。默認情況下,Nokogiri使用DOM解析器,這意味着在解析發生之前將整個XML文檔加載到內存中,如果XML足夠大,這可能會削弱機器。 –