Comment puis-je obtenir la somme de tout le contenu lors de l'analyse d'une balise XML dans Ruby?
-
11-09-2019 - |
Question
J'ai quelques XHTML (mais vraiment tout XML fera) comme ceci:
<h1>
Hello<span class='punctuation'>,</span>
<span class='noun'>World<span class='punctuation'>!</span>
</h1>
Comment puis-je obtenir le contenu complet de la <h1/>
en tant que chaîne en Ruby? Comme dans:
assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content
Effectuez l'une des cadres XML ( Nokogiri , libxml-rubis, etc.) ont ce genre de chose intégrée? Sinon, je me sens comme un Y-Combinator pourrait l'outil pour le travail, mais je ne peux pas tout à fait comprendre ce qu'il ressemblerait.
La solution
Avec Nokogiri vous pouvez simplement demander le text
d'un nœud. La question que je vois quand faire cela est bien que tous les espaces et les sauts de ligne qui sont ce nœud seront retournés, de sorte que vous pourriez vouloir dépouiller les out (probablement une meilleure façon de le faire que ce que je l'ai fait pour cet exemple).
Voici un exemple:
def test_nokogiri_text
value = Nokogiri::HTML.parse(<<-HTML_END)
"<h1>
Hello<span class='punctuation'>,</span>
<span class='noun'>World<span class='punctuation'>!</span>
</h1>"
HTML_END
h1_node = value.search("h1").first
assert_equal("Hello, World!", h1_node.text.split(/\s+/).join(' ').strip)
end
Autres conseils
Nokogiri :: XML :: Node contenu # le fera:
irb(main):020:0> node
=> <h1>
Hello<span class="punctuation">,</span>
<span class="noun">World<span class="punctuation">!</span>
</span>
</h1>
irb(main):021:0> node.content
=> "\n Hello,\n World!\n\n"