如何使用Nokogiri获取包含文本的当前节点之前的第一个节点?

时间:2016-11-15 04:09:02

标签: ruby nokogiri

我有一个包含文字'The f'的节点:

<w:r w:rsidR="00BC78BF">
  <w:t>e takes out his phone and calls a friend.</w:t>
</w:r>
<w:r w:rsidR="00CB49B6">
  <w:t xml:space="preserve"/>
</w:r>
<w:ins w:author="Mitchell Gould" w:date="2016-11-14T14:23:00Z" w:id="8">
  <w:r w:rsidR="00BC7F15">
    <w:t>The f</w:t>
  </w:r>
</w:ins>

我希望第一次出现在此文本节点之前的文本。

我尝试使用:

 node.previous_element.text
 => " " 

previous_node = node.xpath('preceding-sibling::w:r').last
=> " "

这是因为有时previous_element只是一个如上所示的空格,并且可能有许多这些元素只是空格。

如何获得包含文本的第一个兄弟姐妹?

1 个答案:

答案 0 :(得分:0)

我从:

开始
require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <r>
    <t>e takes out his phone and calls a friend.</t>
  </r>
  <r>
    <t/>
  </r>
  <ins>
    <r>
      <t>The f</t>
    </r>
  </ins>
</xml>
EOT

doc.search('//text()').map { |t| t.text.strip }.reject(&:empty?)
# => ["e takes out his phone and calls a friend.", "The f"]

然后它成为一个在"The f"之前识别元素的问题,我将把它作为一项任务留给你。这并不难,但在一个大文档中,肯定会影响代码性能。

//text()是查找文档中所有文本节点的XPath方法。 //基本上意味着“自上而下搜索”。文本节点不仅仅是“f”之类的东西,它也可以是漂亮打印的XML文件中的结束标记之后的换行符。

text.strip后跟reject,用于删除节点,空格和空行之间的任何XML格式。