如何使用Nokogiri

时间:2016-10-02 05:50:53

标签: ruby xml 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>

我选择所有插入的节点:

 @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>和text =&#34; p&#34;的下一个元素。

我无法使用node.next_element,因为它会返回书签元素。

我怎么能用Nokogiri做到这一点?

2 个答案:

答案 0 :(得分: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,只返回与条件匹配的最近w:del

答案 1 :(得分:0)

正如我所理解的那样,您正在寻找相应的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的后续元素。