我有以下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做到这一点?
答案 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:ins
和w:del
的后续元素。