如何使用 Nokogiri 搜索两条路径但按顺序获得结果
How to search two paths but get the results in order using Nokogiri
我正在尝试使用 Nokogiri 搜索前缀为 w
以及 t
或 br
的元素。
例如,如果这是解析返回的 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')
我正在尝试使用 Nokogiri 搜索前缀为 w
以及 t
或 br
的元素。
例如,如果这是解析返回的 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')