Como faço para obter a soma de todo o conteúdo ao analisar uma marca XML em Ruby?
-
11-09-2019 - |
Pergunta
Eu tenho alguns XHTML (mas realmente qualquer XML vai fazer) como este:
<h1>
Hello<span class='punctuation'>,</span>
<span class='noun'>World<span class='punctuation'>!</span>
</h1>
Como faço para obter o conteúdo completo do <h1/>
como uma String em Ruby? Como em:
assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content
Será que algum dos quadros XML ( Nokogiri , libxml-ruby , & c) têm esse tipo de coisa built-in? Se não, eu me sinto como um Y-Combinator pode a ferramenta certa para o trabalho, mas eu não posso bastante descobrir o que seria semelhante.
Solução
Com Nokogiri você pode simplesmente pedir a text
de um nó. O problema que vejo quando fazer isso, porém, é que todos os espaços em branco e quebras de linha que estão em que o nó será devolvido, de modo que você pode querer tirar aqueles fora (provavelmente uma maneira melhor de fazer isso do que o que eu fiz para este exemplo).
Aqui está um exemplo:
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
Outras dicas
Nokogiri de Nokogiri :: XML :: Node # content irá fazê-lo:
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"