是否有更优雅的方式来编写以下代码?
def get_text(element)
text_node = element.children.find &:text?
text_node.text if text_node
end
答案 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