【问题标题】:How to get the first node prior to the current node that contains text using Nokogiri?如何使用 Nokogiri 获取包含文本的当前节点之前的第一个节点?
【发布时间】:2016-11-15 04:09:02
【问题描述】:

我有一个包含文本'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 只是一个空格,如上所示,并且可能有许多这些元素只是空格。

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

【问题讨论】:

  • 您希望收到什么? “e拿出手机给朋友打电话。”? 在代码中你尝试过什么?
  • 我更新了我的问题以显示我尝试过的内容。是的,我想要“e 拿出手机给朋友打电话。”
  • 获取w:t 节点的集合并向后迭代它一步以检索先前的w:t 元素。或者使用递归 previous_element 除非它的 text 属性不为空。
  • 我希望有一种方法可以使用 Nokogiri 的一些更复杂的搜索参数来做到这一点

标签: ruby nokogiri


【解决方案1】:

我会开始:

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 格式。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2011-12-23
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多