Votre exemple XML ne semble pas être correct. Simplifier:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<project>
<parent>
<groupId>parent.jar</groupId>
<artifactId>parent-jar</artifactId>
</parent>
<groupId>child.jar</groupId>
<artifactId>child-jar</artifactId>
</project>
EOT
doc.at('project > artifactId').text # => "child-jar"
En utilisant XPath j'utiliser:
doc.at('/project/artifactId').text # => "child-jar"
Je vous suggère d'apprendre la différence entre search
, xpath
, css
et leurs cousines at*
qui sont tous documentés dans le "Searching a XML/HTML Document" et Node documentation.
Dans l'exemple ci-dessus, j'ai supprimé les informations de l'espace de noms XML pour simplifier les choses. Les espaces de noms XML sont utiles, mais ils sont également irritants et, dans votre exemple XML, vous l'avez brisé en ne fournissant pas une URL valide. Fixation l'exemple avec:
<project xmlns="http://www.w3.org/1999/xhtml">
Je peux utiliser:
namespaces = doc.collect_namespaces # => {"xmlns"=>"http://www.w3.org/1999/xhtml"}
doc.at('project > artifactId', namespaces).text # => "child-jar"
ou:
doc.at('xmlns|project > xmlns|artifactId').text # => "child-jar"
Je préfère et recommande le premier car il est plus lisible et moins bruyant. L'implémentation de CSS dans les sélecteurs de Nokogiri simplifie la plupart des sélecteurs. Passer dans les espaces de noms collectés dans le document simplifie les recherches, que vous utilisiez CSS ou XPath.
Ces travaux aussi:
doc.at('/xmlns:project/xmlns:artifactId').text # => "child-jar"
doc.at('/foo:project/foo:artifactId', {'foo' => "http://www.w3.org/1999/xhtml"}).text # => "child-jar"
Notez que la seconde utilise un espace de noms renommé, qui est utile si vous avez affaire à des déclarations xmlns
redondantes dans le document et la nécessité de faire la différence entre eux.
Le tutoriel "Namespaces" de Nokogiri est utile.
Bien que je n'ai pas les outils pour tester votre code ruby, votre XPath aurait dû renvoyer * only * 'child-jar': http://xpatheval.apphb.com/DI8w0z8D1. – har07
Le problème est l'espace de noms. Il n'est pas référencé dans le sélecteur donc Nokogiri/libXML2 ne sait pas où chercher. –