2014-05-16 7 views
1

Ça fait toute la journée que j'essaie de comprendre comment analyser USPTO bulk XML files. J'ai essayé de télécharger one de ces fichiers, décompressé puis exécutez:Comment analyser les fichiers XML USPTO avec Ruby et Nokogiri?

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

Mais il semble charger seul le premier élément, tous les brevets (dans ce fichier, il y a quelques milliers)

Qu'est-ce que je fais mal?

+0

Si le fichier contient des milliers d'enregistrements, il peut être préférable/plus intelligent/plus sûr d'écrire un analyseur SAX (en utilisant bien sûr Nokogiri). Par défaut, Nokogiri utilise un analyseur DOM, ce qui signifie que le document XML entier est chargé en mémoire avant l'analyse, ce qui peut paralyser une machine si le XML est suffisamment grand. –

Répondre

3

Le fichier auquel vous avez lié, et vraisemblablement les autres, n'est pas un fichier XML valide car il ne possède pas d'élément racine. De Wikipedia:

Chaque document XML a exactement un seul élément racine .

Nokogiri laisse deviner si vous regardez les erreurs (suggérées par Arup Rakshit), comme détaillé dans 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> 
# ] 

Le fichier semble être une concaténation d'une série de fichiers XML valides, chaque ayant un <us-patent-grant/> comme élément racine.

Heureusement, Nokogiri peut gérer ce code XML non valide si vous le traitez comme un fragment de document. Essayez ceci:

Nokogiri::XML::DocumentFragment.parse(File.read('ipg140513.xml')).select{|element| element.name == 'us-patent-grant'} 

Le select choisit le noeud racine de chaque document chaînés, en ignorant les instructions de traitement et les déclarations DTD.

Alternativement, vous pouvez pré-traiter le fichier et le scinder en ses documents constituants, correctement formatés. L'analyse simultanée d'un document de 650 Mo est très lente et demande beaucoup de mémoire.

+0

Votre réponse est bonne, mais * Nokogiri * lui-même peut dire, quelle erreur il éprouve. Regardez ceci - http://nokogiri.org/tutorials/ensuring_well_formed_markup.html –

+0

Merci pour la suggestion, @ArupRakshit, j'ai mis à jour la réponse. –

+1

+1 ... monsieur. Nokogiri est très intelligent nah? :) –

Questions connexes