Nokogiri:如何从XML :: Element中检索文本,从其后代中排除文本?

时间:2011-07-11 14:32:45

标签: ruby xpath nokogiri

是否有更优雅的方式来编写以下代码?

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

3 个答案:

答案 0 :(得分:5)

你可以写

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

返回element的文本子文本的原始文本,不包括后代节点中的任何文本(而您的代码只返回element的第一个文本子项。)

答案 1 :(得分:0)

请记住,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  "

剥去尾随回车,你应该好好去。

答案 2 :(得分:0)

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