Nokogiri: Как извлечь текст из XML :: Element, исключая текст из его потомков? - PullRequest
2 голосов
/ 11 июля 2011

Есть ли более элегантный способ написать следующий код?

def get_text(element)
  text_node = element.children.find &:text?
  text_node.text if text_node
end

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

Вы можете написать

element.xpath('text()').to_s

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

0 голосов
/ 28 января 2013
of course this syntax will also help you

==================================

doc = Nokogiri::Slop <<-EOXML
<employees>
  <employee status="active">
    <fullname>Dean Martin</fullname>
  </employee>
  <employee status="inactive">
    <fullname>Jerry Lewis</fullname>
  </employee>
</employees>
EOXML
====================================
# navigate!
doc.employees.employee.last.fullname.content # => "Jerry Lewis"

fullname = @doc.xpath("//character")
puts fullname.text
0 голосов
/ 12 июля 2011

Помните, что DOM является иерархическим, поэтому вам необходимо удалить дочерние узлы:

Начиная с этого:

require 'nokogiri'

xml = <<EOT
<xml>
  <a>some text
    <b>
      <c>more text</c>
    </b>
  </a>
</xml>
EOT

doc = Nokogiri::XML(xml)

Если вы не возражаете против этого:

doc.at('b').remove
doc.text #=> "\n  some text\n    \n  \n"

Если вы не возражаете:

a_node = Nokogiri::XML.fragment(doc.at('a').to_xml)

a_node.at('b').remove
a_node.text #=> "some text\n    \n  "

Снимите заднюю каретку, и вам будет хорошо идти.

...