我有一个包含文本'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格式。