我有一个包含文字'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
只是一个如上所示的空格,并且可能有许多这些元素只是空格。
如何获得包含文本的第一个兄弟姐妹?
答案 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格式。