2009-09-20 11 views
0

J'essaie d'extraire des informations XML de Weather Underground.Récupère le texte d'un élément à partir du document XML

Je peux ouvrir la ressource et extraire les éléments souhaités, mais je souhaite vraiment renvoyer l'élément text en tant que variable, sans les balises d'élément XML contenant, afin de pouvoir le manipuler et l'afficher sur une page Web.

Peut-être y at-il un moyen de faire cela en utilisant regexp pour enlever les balises, mais je suppose/j'espère que je peux le faire d'une manière plus élégante directement dans Nokogiri.

Actuellement, je me sers RIR pour travailler la syntaxe:

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> 

J'ai besoin d'aide avec la syntaxe spécifique en utilisant des constructions telles que:

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') 

Toutes les erreurs de retour.

Répondre

0

Quelque chose comme cela fonctionne pour moi:

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

Comme par XPath, vous pouvez retourner le nœud de texte d'un élément avec text().

Dans votre exemple, doit être doc.xpath('/current_observation/weather/text()') pour obtenir le contenu du nœud de texte weather's.

+0

+1: Cela fonctionne. –

+0

kRON oui, merci c'est exactement ça. J'ai aussi obtenu doc.xpath ('/ current_observation/weather'). Text() pour fonctionner, mais il a retourné des guillemets autour de la chaîne. Je pense que votre chemin est probablement plus utile pour moi. Merci. –

+0

Oui cela fonctionne. J'ai également essayé doc.xpath ('/ current_observation/weather'). Text() - mais il renvoie des guillemets autour de la chaîne. Votre chemin est probablement plus utile pour moi. Merci –

0

L'une des bonnes choses à propos de Nokogiri est sa flexibilité lors de l'écriture des accesseurs. Vous n'êtes pas limité à XPath seulement, vous pouvez plutôt utiliser 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)"} 
Questions connexes