Обдумывая недавно заданный вопрос , я начал задумываться, существует ли действительно простой способ работы с XML-документами в Python.Питонический способ, если хотите.
Возможно, я смогу объяснить лучше, если приведу пример: скажем, следующее - что я считаю хорошим примером того, как XML (неправильно) используется в веб-сервисах, - этоответ, который я получаю от запроса http на http://www.google.com/ig/api?weather=94043
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
<forecast_information>
<city data="Mountain View, CA"/>
<postal_code data="94043"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2010-06-23"/>
<current_date_time data="2010-06-24 00:02:54 +0000"/>
<unit_system data="US"/>
</forecast_information>
<current_conditions>
<condition data="Sunny"/>
<temp_f data="68"/>
<temp_c data="20"/>
<humidity data="Humidity: 61%"/>
<icon data="/ig/images/weather/sunny.gif"/>
<wind_condition data="Wind: NW at 19 mph"/>
</current_conditions>
...
<forecast_conditions>
<day_of_week data="Sat"/>
<low data="59"/>
<high data="75"/>
<icon data="/ig/images/weather/partly_cloudy.gif"/>
<condition data="Partly Cloudy"/>
</forecast_conditions>
</weather>
</xml_api_reply>
После загрузки / анализа такого документа, я хотел бы иметь возможность получить доступ к информации так же просто, как, скажем,
>>> xml['xml_api_reply']['weather']['forecast_information']['city'].data
'Mountain View, CA'
или
>>> xml.xml_api_reply.weather.current_conditions.temp_f['data']
'68'
Из того, что я видел до сих пор, кажется, что ElementTree
является самым близким к тому, о чем я мечтаю.Но его там нет, все еще есть некоторая неуклюжесть, чтобы сделать, потребляя XML.OTOH, я думаю, что это не так сложно - вероятно, просто тонкая фанера поверх синтаксического анализатора - и все же это может уменьшить раздражение при работе с XML.Есть ли такая магия?(А если нет - почему?)
PS.Обратите внимание, что я уже пробовал BeautifulSoup
, и, хотя мне нравится его подход, у него есть реальные проблемы с пустыми <element/>
s - примеры см. Ниже в комментариях.