Ceci est couvert à la fois dans la documentation de Nokogiri, et dans de nombreuses réponses à propos de Nokogiri ici sur Stack Overflow.
La documentation NodeSet dit:
inner_text ⇒ objet également connu sous le nom: texte
Obtenez le texte interne de tous les objets Node contenu
Alors que la documentation Node dit:
content ⇒ Objet (aussi: #text, #inner_text)
Renvoie le contenu de ce noeud.
Vous pouvez le voir en action:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo>
EOT
doc.at('foo').text # => "my dog has fleas he gave to me"
doc.at('foo').children.map(&:text) # => ["my dog ", "has", " ", "fleas", " he gave ", "to me"]
Notez la chaîne vide " "
. C'est le résultat de l'espace entre
</bar> <bar>
Alors que nous, les humains aiment penser que rien être, en XML et HTML, il est encore un nœud de texte, il apparaît lors de la marche à travers le children
, depuis un nœud de texte est encore un enfant. Normalement, un sélecteur plus strict serait utilisé pour l'éviter, mais dans ce cas, il n'y a pas de bon moyen de le faire car les autres chaînes récupérées ont aussi des espaces parasites.Je ferais probablement quelque chose comme ceci:
doc.at('foo').children.map { |node| node.text.strip }
# => ["my dog", "has", "", "fleas", "he gave", "to me"]
ou:
doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? }
# => ["my dog", "has", "fleas", "he gave", "to me"]
Ensuite, en utilisant join(' ')
résultats dans:
doc.at('foo').children.map { |node| node.text.strip }.join(' ')
# => "my dog has fleas he gave to me"
ou:
doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? }.join(' ')
# => "my dog has fleas he gave to me"
En ce qui concerne comme sachant quel est le root
:
doc.root # => #<Nokogiri::XML::Element:0x3fecdc8a2434 name="foo" children=[#<Nokogiri::XML::Text:0x3fecdc8a7984 "my dog ">, #<Nokogiri::XML::Element:0x3fecdc8a795c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a72a4 "has">]>, #<Nokogiri::XML::Text:0x3fecdc8a7934 " ">, #<Nokogiri::XML::Element:0x3fecdc8a790c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6e94 "fleas">]>, #<Nokogiri::XML::Text:0x3fecdc8a78e4 " he gave ">, #<Nokogiri::XML::Element:0x3fecdc8a78bc name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6a84 "to me">]>]>
doc.root.name # => "foo"
Veuillez lire "[ask]" avec les pages liées et "[mcve]". Votre question n'est pas bien posée. Vous nous avez donné un peu de XML et ensuite ne nous montrez rien de ce que vous avez essayé: Nous avons besoin de l'exemple minimum de votre code qui montre le problème avec la sortie désirée. Je ne vote pas pour fermer, mais s'il vous plaît faites ces choses à l'avenir parce qu'elles nous aident à vous aider et aident les autres à chercher des solutions similaires. –