Оба средства доступа Nokogiri для CSS и XPath позволяют указывать несколько тегов, что может быть полезно для решения подобных проблем.Вместо того, чтобы просматривать каждый тег в теге page
документа:
require 'nokogiri'
doc = Nokogiri::XML('
<xml>
<body>
<image>image</image>
<text>text</text>
<video>video</video>
<other>other</other>
<image>image</image>
<text>text</text>
<video>video</video>
<other>other</other>
</body>
</xml>')
Это поиск с использованием CSS:
doc.search('image, text, video').each do |node|
case node.name
when 'image'
puts node.text
when 'text'
puts node.text
when 'video'
puts node.text
else
puts 'should never get here'
end
end
# >> image
# >> image
# >> text
# >> text
# >> video
# >> video
Обратите внимание, что он возвращает теги в том порядке, в котором CSSаксессор указывает это.Если вам нужен порядок тегов в документе, вы можете использовать XPath:
doc.search('//image | //text | //video').each do |node|
puts node.text
end
# >> image
# >> text
# >> video
# >> image
# >> text
# >> video
В любом случае программа должна работать быстрее, потому что весь поиск происходит в libXML, возвращая только те узлы, которые вам нужныОбработка Руби.
Если вам нужно ограничить поиск с помощью тега <page>
, вы можете выполнить поиск заранее, чтобы найти узел page
, а затем выполнить поиск под ним:
doc.at('page').search('image, text, video').each do |node|
...
end
или
doc.at('//page').search('//image | //text | //video').each do |node|
...
end