0

Weather Underground から XML から情報を抽出しようとしています。

textリソースを開いて目的の要素を取り出すことはできますが、要素を操作して Web ページに表示できるように、XML 要素タグを含めずに要素を変数として返したいと考えています。

正規表現を使用してタグを取り除く方法があるかもしれませんが、Nokogiri で直接、よりエレガントな方法でこれを行うことができると思います/希望しています。

現在、irb を使用して構文を作成しています。

irb>require 'rubygems'
irb>require 'nokogiri'
irb>require 'open-uri'
irb>doc = Nokogiri::XML(open('http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=KBHB'))
=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
=> <?xml version="1.0"?>
# [...]
<!-- 0.036:0 -->

irb>doc.xpath('/current_observation/weather')
=> <weather>Clear</weather>irb(main):019:0> 
irb>doc.xpath('/current_observation/wind_dir')
=> <wind_dir>North</wind_dir>
irb>doc.xpath('/current_observation/wind_mph')
=> <wind_mph>10</wind_mph>
irb>doc.xpath('/current_observation/pressure_string')
=> <pressure_string>31.10 in (1053 mb)</pressure_string>

次のような構文を使用しているときに、特定の構文についてサポートが必要です。

doc.xpath.element('/current_observation/weather')
doc.xpath.text('/current_observation/weather')
doc.xpath.node('/current_observation/weather')
doc.xpath.element.text('/current_observation/weather')

すべての戻りエラー。

4

3 に答える 3

1

XPath に従って、要素のテキスト ノードを で返すことができますtext()

あなたの例では、テキストノードのコンテンツを取得する必要があります。doc.xpath('/current_observation/weather/text()')weather's

于 2009-09-20T14:20:06.413 に答える
0

このようなものは私のために働きます:

irb(main):019:0> doc.xpath('//current_observation/weather').first.content
=> "Clear"
于 2009-09-20T14:10:49.537 に答える
0

Nokogiriの良いところの1つは、アクセサーを作成するときの柔軟性です。XPathだけに限定されるのではなく、代わりにCSSアクセサーを使用できます。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::XML(open('http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=KBHB'))

weather_report = %w[weather wind_dir wind_mph pressure_string].inject({}) { |h, n|
  h[n.to_sym] = doc.at('current_observation ' << n).text
  h 
} 
weather_report # => {:weather=>"Overcast", :wind_dir=>"South", :wind_mph=>"6", :pressure_string=>"29.67 in (1005 mb)"}
于 2011-03-12T10:13:51.383 に答える