<lunch hours="11-3">
<item price="$5.00">hamburger</item>
</lunch>
<dinner hours="3-10">
<item price="8.00">spaghetti</item>
</dinner>
</menu>
222
Глава 8. Данные должны куда-то попадать
Рассмотрим основные характеристики формата XML.
Теги начинаются с символа <. В этом примере использованы теги menu, breakfast,
lunch, dinner и item.
Пробелы игнорируются.
Обычно после начального тега вроде <menu> следует остальной контент, а затем
соответствующий конечный тег вроде </menu>.
Теги могут быть вложены в другие теги на любой глубине. В этом примере теги
item являются потомками тегов breakfast, lunch и dinner, которые, в свою очередь,
являются потомками тега menu.
Внутри стартового тега могут встретиться опциональные атрибуты. В этом
примере price является опциональным атрибутом тега item.
Теги могут содержать значения. В этом примере каждый тег item имеет значение
вроде pancakes у второго элемента тега breakfast.
Если у тега с именем thing нет значений или потомков, он может быть оформлен
как единственный тег путем включения прямого слеша прямо перед закрыва-
ющей угловой скобкой (<thing/>), вместо того чтобы использовать начальный
и конечный теги <thing> и </thing>.
Место размещения данных — атрибуты, значения или теги-потомки — являет-
ся в какой-то мере произвольным. Например, мы могли бы написать последний
тег item как <item price="$8.00" food="spaghetti"/>.
XML часто используется в каналах данных и сообщениях и имеет подформаты
вроде RSS и Atom. В некоторых отраслях, например в области бизнеса, имеются
специализированные форматы XML (http://bit.ly/xml-finance).
Сверхгибкость формата XML вдохновила многих людей на создание библиотек
для Python, каждая из которых отличается от других подходом и возможностями.
Самый простой способ проанализировать XML в Python — использовать би-
блиотеку ElementTree. Рассмотрим небольшую программу, которая анализирует
файл menu.xml и выводит на экран некоторые теги и атрибуты:
>>> import xml.etree.ElementTree as et
>>> tree = et.ElementTree(file='menu.xml')
>>> root = tree.getroot()
>>> root.tag
'menu'
>>> for child in root:
... print('tag:', child.tag, 'attributes:', child.attrib)
for grandchild in child:
... print('\ttag:', grandchild.tag, 'attributes:', grandchild.attrib)
...
tag: breakfast attributes: {'hours': '7-11'}
tag: item attributes: {'price': '$6.00'}