Comment accéder à des attributs à l'aide de Nokogiri
J'ai une tâche simple d'accéder à des valeurs de certains attributs. C'est un simple script qui utilise Nokogiri::XML::Builder
pour créer un simple document XML.
require 'nokogiri'
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.Placement(:messageId => "392847-039820-938777", :system => "MOD", :version => "2.0") {
xml.objects {
xml.object(:myattribute => "99", :anotherattrib => "333")
xml.nextobject_ '9387toot'
xml.Entertainment "Last Man Standing"
}
}
end
puts builder.to_xml
puts builder.root.attributes["messageId"]
Les résultats sont les suivants:
<?xml version="1.0" encoding="UTF-8"?>
<Placement messageId="392847-039820-938777" version="2.0" system="MOD">
<objects>
<object anotherattrib="333" myattribute="99"/>
<nextobject>9387toot</nextobject>
<Entertainment>Last Man Standing</Entertainment>
</objects>
</Placement>
C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/document.rb:178:in `add_child': Document already has a root node (RuntimeError)
from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/node.rb:455:in `parent='
from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:358:in `insert'
from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:350:in `method_missing'
from C:/Documents and Settings/etrojan/workspace/Lads/tryXPATH2.rb:15
Le XML qui est généré a l'air bien. Cependant, mes tentatives pour accéder aux attributs de provoquer une erreur sera générée:
Document already has a root node
Je ne comprends pas pourquoi puts
serait la cause de cette erreur.
Vous devez vous connecter pour publier un commentaire.
À l'aide de Nokogiri::XML::Reader qui fonctionne pour votre exemple, mais n'est probablement pas la réponse que vous cherchez (Notez qu'il n'est pas de
attributs
méthode pour le Constructeur).Notez que si vous avez émis
reader.read
de nouveau et a ensuite essayéreader.attribute("messageId")
le résultat seranil
depuis le nœud courant n'aura pas cet attribut.Ce que vous voulez probablement à faire est d'utiliser Nokogiri::XML::Document si vous souhaitez rechercher un document XML par attribut.
nokogiri_element.xpath("@id").text()
doc.at_xpath
permettrait de réaliser la même chose queelems[0]
.doc.at_xpath("//*[@messageId]")['messageId']
serait plus simple.Voici un peu de manière plus succincte pour accéder à des attributs à l'aide de
Nokogiri
(en supposant que vous avez déjà votre xml stocké dans une variable appeléexml
, comme couverte par @atomicules réponse):