如何使用 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:ins
和 w:del
的后续元素。
我有以下 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
... 之后的 [. = 'p'][1]
: ... where inner text equals 'p', then limit the result to 1. 也就是说,对于每个w:ins
, return 只有最近的w:del
符合条件
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:ins
和 w:del
的后续元素。