2013-07-26 5 views
1

je le fichier XML suivant:fichier XML avec nokogiri Parsing

<?xml version='1.0' encoding='UTF-8'?> 
<sparql xmlns='http://www.w3.org/2005/sparql-results#'> 
     <head> 
       <variable name='s'/> 
     </head> 
     <results> 
       <result> 
         <binding name='s'> 
           <uri>http://data.open.ac.uk/podcast/c9ddc42f6e1db95f59c83312d62da0ee</uri> 
         </binding> 
       </result> 
       <result> 
         <binding name='s'> 
           <uri>http://data.open.ac.uk/podcast/18873effb6c38ed83a7522ffb7c61c1b</uri> 
         </binding> 
       </result> 
     </results> 
</sparql> 

Je veux obtenir les URIs du document. J'ai essayé ces commandes:

doc = Nokogiri::XML(File.open("file.xml")) 
doc.xpath("//uri") 

mais il retourne nul.

Cependant, si je le fichier modifié à ceci:

<results> 
        <result> 
          <binding name='s'> 
            <uri>http://data.open.ac.uk/podcast/c9ddc42f6e1db95f59c83312d62da0ee</uri> 
          </binding> 
        </result> 
        <result> 
          <binding name='s'> 
            <uri>http://data.open.ac.uk/podcast/18873effb6c38ed83a7522ffb7c61c1b</uri> 
          </binding> 
        </result> 
      </results> 

Les commandes ci-dessus renvoient les URIs correctement.

Répondre

2

Vous devez spécifier l'espace de nom de l'élément que vous essayez de sélectionner. Dans le premier document, il s'agit de http://www.w3.org/2005/sparql-results#, hérité du nœud racine. Dans le second document, cela fonctionne, car vous supprimez la déclaration d'espace de nom en supprimant ce nœud racine.

Les bonnes nouvelles sont parce que votre espace de noms est défini dans le nœud racine Nokogiri sera il enregistre automatiquement pour vous, et vous devriez être en mesure de choisir les <uri> éléments avec

doc.xpath("//xmlns:uri") 
+1

Vous pouvez également utiliser la 'css() 'method (qui ignore les espaces de noms), ie' doc.css ('uri') 'ou utilise l'approche nucléaire destructrice de' doc.remove_namespaces! 'et alors votre code original fonctionnera. – Phrogz