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.
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. –