从XML doc获取元素文本

时间:2009-09-20 12:00:29

标签: ruby xml xpath nokogiri

我正在尝试从Weather Underground中提取XML中的一些信息。

我可以打开资源并提取所需的元素,但我真的想要将元素text作为变量返回,而不包含XML元素标记,因此我可以操作它并在Web上显示它页。

也许有一种方法可以使用正则表达式去除标签,但我怀疑/希望我可以直接在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')

所有返回错误。

3 个答案:

答案 0 :(得分:1)

根据XPath,您可以使用text()返回元素的文本节点。

在您的示例中,应该doc.xpath('/current_observation/weather/text()')以获取weather's文本节点的内容。

答案 1 :(得分:0)

这样的事情对我有用:

irb(main):019:0> doc.xpath('//current_observation/weather').first.content
=> "Clear"

答案 2 :(得分:0)

Nokogiri的一个好处是它在编写访问器时的灵活性。您不仅限于XPath,而是可以使用CSS accessors

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)"}