【发布时间】:2011-12-21 04:12:38
【问题描述】:
我的 xml:
http://www.google.ru/ig/api?weather=Chelyabinsk
<forecast_information>
<city data="Chelyabinsk, Province of Chelyabinsk"/>
</forecast_information>
例如如何获取城市数据?不是inner_html,只是城市数据、邮政编码等属性。
【问题讨论】:
我的 xml:
http://www.google.ru/ig/api?weather=Chelyabinsk
<forecast_information>
<city data="Chelyabinsk, Province of Chelyabinsk"/>
</forecast_information>
例如如何获取城市数据?不是inner_html,只是城市数据、邮政编码等属性。
【问题讨论】:
XPath 在解析 XML 时会有很大帮助。看起来像hpricot has support for it,所以非常简单。
在city 元素中提取data 属性的XPath 表达式如下:
/forecast_information/city/@data
表达式说,在名为city 的元素内找到名为data 的属性(这就是@ 符号的含义),而该元素又在名为forecast_information 的元素内。
现在,您在 google.ru 上链接的 XML 比您在此处发布的示例更复杂。要从中提取相同的信息,请使用以下表达式:
//city/@data
此表达式表示,无论city 在源 XML 中的哪个位置,都在名为 city 的元素内找到名为 data 的属性。
【讨论】:
选择的答案对我不起作用,但 xpath 部分让我走上了正轨。这就是我最终得到的结果:
doc = Hpricot::XML(xml)
result = doc.at("//city")['data']
这是我在 ruby 中针对这样的 xml 元素的完整解析器:
<Response Field1="abc" Field2="123">
def parse(xml)
vars = {}
fields = %w[Field1 Field2 Field3]
doc = Hpricot::XML(xml)
for field in fields
vars[field] = doc.at("//Response")[field]
end
return vars
end
【讨论】: