Как получить сумму всего содержимого при разборе тега XML в Ruby? - PullRequest
1 голос
/ 04 июня 2009

У меня есть некоторый XHTML (но на самом деле подойдет любой XML), например:

<h1>
  Hello<span class='punctuation'>,</span>
  <span class='noun'>World<span class='punctuation'>!</span>
</h1>

Как получить полное содержимое <h1/> в виде строки в Ruby? Как в:

assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content

Есть ли в какой-либо из структур XML ( Nokogiri , libxml-ruby и т. Д.) Встроенные функции такого рода? Если нет, я чувствую, что Y-Combinator может быть правильным инструментом для работы, но я не могу понять, как он будет выглядеть.

Ответы [ 2 ]

3 голосов
/ 04 июня 2009

С Nokogiri вы можете просто попросить text узла. Проблема, которую я вижу при этом, заключается в том, что все пробельные символы и символы новой строки, которые находятся в этом узле, будут возвращены, поэтому вы можете удалить их (вероятно, лучший способ сделать это, чем то, что я сделал для этого примера).

Вот образец:

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
2 голосов
/ 04 июня 2009

Nokogiri's Nokogiri :: XML :: Node # content сделает это:

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"
...