如何使用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只是一个空格,如上图所示,并且可能有许多这样的元素只是空格。

如何获得包含文本的第一个优先兄弟?

我会这样开头:

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方法。//的意思是"从上到下搜索"。文本节点不只是像"The f"这样的东西,它还可以是打印精美的XML文件中结束标记后面的新行。

text.strip后跟reject是为了删除节点、空格和空行之间的任何XML格式。

相关内容

  • 没有找到相关文章

最新更新