Разобрать XML с помощью hpricot, получить атрибуты
Мой xml:
http://www.google.ru/ig/api?weather=Chelyabinsk
<forecast_information>
<city data="Chelyabinsk, Province of Chelyabinsk"/>
</forecast_information>
Как получить данные города, например? Не inner_html, просто атрибуты, такие как данные города, почтовый индекс и т. Д.
2 ответа
XPath будет очень полезен при разборе XML. Похоже, что hpricot поддерживает его, так что это невероятно просто.
Выражение XPath для извлечения data
атрибут внутри city
Элемент выглядит следующим образом:
/forecast_information/city/@data
Выражение говорит, найти атрибут с именем data
(вот что @
знак означает) внутри элемента с именем city
, который в свою очередь находится внутри элемента с именем forecast_information
,
Теперь XML, который вы указали на google.ru, более сложен, чем пример, который вы опубликовали здесь. Чтобы извлечь из него ту же информацию, используйте это выражение:
//city/@data
Это выражение говорит, найти атрибут с именем data
внутри элемента с именем city
, не важно где city
находится в исходном XML.
Выбранный ответ не сработал для меня, но часть 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