Проанализируйте XML-документ в Ruby

Иногда можно использовать регулярные выражения для извлечения чего-либо из HTML. Серьезно, поссориться с тупым парсером или использовать быстрое регулярное выражение, например /<a href="([^"]+)">/? Это не идеально, но ваше программное обеспечение будет работать намного быстрее, и вы, вероятно, сможете использовать еще одно регулярное выражение, чтобы убедиться, что найденное совпадение действительно похоже на URL. Конечно, он взломан и, возможно, не работает в нескольких крайних случаях, но этого достаточно для большинства случаев использования.

На основании огромного тома «Как использовать регулярные выражения для получения HTML?» вопросы, которые публикуются здесь почти ежедневно, и тот факт, что каждый ответ - «Использовать анализатор HTML», это должно быть достаточно спорным.

7
задан freddiefujiwara 1 July 2009 в 05:37
поделиться

3 ответа

попробуйте это


require 'rexml/document'

doc = REXML::Document.new File.new('mydoc.xml')

doc.elements('*/foo/baa') { |element| puts element.get_text }

Я предпочитаю самоцветы Nokogiri и Hpricot. Вы можете попробовать их, если хотите.

9
ответ дан 7 December 2019 в 03:19
поделиться
require 'rexml/document'

xml = <<-EOS
<foo>
  <baa>value</baa>
</foo>
EOS

doc = REXML::Document.new(xml)
doc.root.elements.each("baa") { |element| p element.text }

Если вы хотите собирать значения, вы можете вместо этого использовать to_a.map или inject. См. REXML :: ELements .

0
ответ дан 7 December 2019 в 03:19
поделиться

Решение Ришава меня бросает.

11:50:18 Temp$ ruby rx.rb
rx.rb:5:in `elements': wrong number of arguments (1 for 0) (ArgumentError)
        from rx.rb:5
11:50:25 Temp$

Вот несколько альтернативных подходов:

require 'rexml/document'

doc = REXML::Document.new DATA

doc.elements.each('//foo/baa') { |element| puts element.get_text }
baas = REXML::XPath.each(doc, '//foo/baa/text()') {|txt| p txt}
p baas

__END__
<foo>
  <baa>value</baa>
</foo>
0
ответ дан 7 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: