Как найти два пути, но получить результаты в порядке, используя Nokogiri - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь найти элементы с префиксом w, а также t или br, используя Nokogiri.

Например, если это ядро ​​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>']

Вместо этого я хочу (элементы в порядке оригинала делают c):

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Используя 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 селекторы рекомендуются авторами Нокогири, потому что они обычно проще и менее шумные.

Используя 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 документация для получения дополнительной информации.

0 голосов
/ 03 апреля 2020

Благодаря ответу Жестянщика , я искал ответ:

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