如何使用 Nokogiri 获取包含具有特定值的文本的下一个元素

How to get the next element that contains text with a specific value using Nokogiri

我有以下 XML:

<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>

我select所有插入的节点:

 @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 作为 returns 书签元素。

我如何使用 Nokogiri 执行此操作?

您可以尝试使用 XPath following-sibling 轴完成此任务:

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

简要说明:

  • /following-sibling::w:del : 查找位于当前 w:ins ...
  • 之后的 w:del 元素
  • [. = 'p'][1] : ... where inner text equals 'p', then limit the result to 1. 也就是说,对于每个 w:ins, return 只有最近的 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 的后续元素。