如何使用 Nokogiri 搜索两条路径但按顺序获得结果

How to search two paths but get the results in order using Nokogiri

我正在尝试使用 Nokogiri 搜索前缀为 w 以及 tbr 的元素。

例如,如果这是解析返回的 doc 的核心:

<w:t></w:t><w:br></w:br><w:t></w:t>

本次搜索

doc.search('.//w:t','.//w:br')

结果:

['<w:t></w:t>','<w:t></w:t>','<w:br></w:br>']

相反,我想要(元素按原始文档的顺序):

['<w:t></w:t>','<w:br></w:br>','<w:t></w:t>']

使用 CSS 选择器你可以这样做:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <t></t><br></br><t></t>
</xml>
EOT

doc.search('t, br')
# => [#<Nokogiri::XML::Element:0x3c name="t">, #<Nokogiri::XML::Element:0x50 name="br">, #<Nokogiri::XML::Element:0x64 name="t">]

doc.search('t, br').map(&:to_html)
# => ["<t></t>", "<br>", "<t></t>"]

CSS 选择器是 Nokogiri 的作者推荐的,因为它们通常更容易且噪音较小。

使用 XPath,这行得通:

doc.search('//t | //br')
# => [#<Nokogiri::XML::Element:0x3c name="t">, #<Nokogiri::XML::Element:0x50 name="br">, #<Nokogiri::XML::Element:0x64 name="t">]

doc.search('//t | //br').map(&:to_html)
# => ["<t></t>", "<br>", "<t></t>"]

但是,您的 XML 有命名空间,而您没有向我们展示适当的命名空间声明,所以这留给您自己解决。

有关详细信息,请参阅 Nokogiri 的 Namespaces 文档。

感谢 the Tin Man 的回复,我正在寻找的答案是这个

doc.search('.//w:t | .//w:br')