2016-10-02 34 views
1

我有以下XML特定值的下一個元素:如何獲得包含文本使用引入nokogiri

<w:r w:rsidR="00AB3D3B"> 
     <w:t xml:space="preserve">His sister </w:t> 
    </w:r> 
    <w:ins w:author="Chell" w:date="2016-10-02T11:19:00Z" w:id="5"> 
     <w:r w:rsidR="00AB3D3B"> 
      <w:t>P</w:t> 
     </w:r> 
    </w:ins> 
    <w:bookmarkStart w:id="6" w:name="_GoBack"/> 
    <w:bookmarkEnd w:id="6"/> 
    <w:del w:author="Chell" w:date="2016-10-02T11:19:00Z" w:id="7"> 
     <w:r w:rsidDel="00AB3D3B" w:rsidR="00AB3D3B"> 
      <w:delText>p</w:delText> 
     </w:r> 
    </w:del> 
    <w:r w:rsidR="00AB3D3B"> 
     <w:t>olley had a sharp eye for detail.</w:t> 
    </w:r> 

我選擇所有插入的節點:

@insertions = @file.xpath("//w:ins") 

第一要素是:

<w:ins w:author="Chell" w:date="2016-10-02T11:19:00Z" w:id="5"> 
    <w:r w:rsidR="00AB3D3B"> 
     <w:t>P</w:t> 
    </w:r> 
</w:ins> 

我需要得到一個包含標籤<w:del>和文本的下一個元素= 「P」。我不能使用node.next_element,因爲它會返回書籤元素。

我該如何與Nokogiri做到這一點?

回答

1

您可以嘗試使用XPath following-sibling軸此任務:

@file.xpath("//w:ins/following-sibling::w:del[. = 'p'][1]") 

簡要說明:

  • /following-sibling::w:del:找到w:del元素位於當前w:ins後...
  • [. = 'p'][1]:...其中內部文本等於「P」,然後將結果限制爲1。換言之,對於每個w:ins,僅返回正如我理解的問題與條件匹配的
+0

感謝har07奇妙的答案。我從來沒有見過這種方法 - 兄弟姐妹。非常瞭解更多。 – chell

0

,即使最近的w:del ,您正在尋找相應的w:del元素。你可能想正好趕上他們都與xpath

doc = %q|<w:r w:rsidR="00AB3D3B"> ... | 
xml = Nokogiri::XML(doc) 
ins, del, * = xml.xpath('//w:ins[@w:author="Chell"]//w:t|//w:del[@w_author="Chell"]//w:delText') 
[ins, del] 
#⇒ => [ 
# [0] #<Nokogiri::XML::Element:0x32f0b2c name="w_t" children=[#<Nokogiri::XML::Text:0x32ef0ec "P">]>, 
# [1] #<Nokogiri::XML::Element:0x32f0b18 name="w_delText" children=[#<Nokogiri::XML::Text:0x32eea70 "p">]> 
# ] 

這樣,你會得到w:insw:del的後續元素。

+0

這也非常有幫助。我接受har07,因爲它更符合我尋找的內容。感謝Mudasobwa。 – chell