Разобрать 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
Другие вопросы по тегам