2016-11-15 58 views
0

我有一个包含文本'The f'一个节点:如何使用Nokogiri获取包含文本的当前节点之前的第一个节点?

<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"一个问题,我会离开为你一个任务:

+0

你期望得到什么? “e拿出他的电话,给朋友打电话。”?你在Code_中尝试过什么? – mudasobwa

+0

我更新了我的问题以显示我所尝试的内容。是的,我希望得到“”e取出他的电话,并打电话给朋友。“ – chell

+0

获取'w:t'节点的集合并向后迭代一次以获取_previous'w:t' element_。递归'previous_element',除非它的'text'属性不为空 – mudasobwa

回答

0

与我会开始。这并不难,但是在一个大文档中,肯定会影响代码的性能。

//text()是查找文档中所有文本节点的XPath方式。基本上,//表示“从上到下搜索”。文本节点不仅仅是“The f”之类的东西,它也可以是一个漂亮打印的XML文件中的结束标记之后的新行。

text.strip其次是reject是为了移除节点,空格和空行之间的任何XML格式。

相关问题