Главная страница

справочник по Python. мм isbn 9785932861578 9 785932 861578


Скачать 4.21 Mb.
Названиемм isbn 9785932861578 9 785932 861578
Анкорсправочник по Python
Дата08.05.2022
Размер4.21 Mb.
Формат файлаpdf
Имя файлаBizli_Python-Podrobnyy-spravochnik.440222.pdf
ТипСправочник
#518195
страница64 из 82
1   ...   60   61   62   63   64   65   66   67   ...   82
)
Отыскивает все дочерние узлы и возвращает список элементов, соответ- ствующих указанному пространству имен namespaceuri и локальному име- ни localname. Возвращаемый список является объектом класса NodeList.
Узлы типа Element
Узел e типа Element представляет одиночный элемент XML, такой как
...
. Чтобы извлечь текст из элемента, необходимо отыскать в нем дочерние узлы типа Text. Для извлечения другой информации могут использоваться следующие атрибуты и методы:
e.tagName
Имя тега элемента. Например, если элемент определен как ‘’, име- нем тега будет строка ‘foo’.
e.getElementsByTagName(tagname)
Возвращает список всех дочерних узлов с указанным именем тега.
e.getElementsByTagNameNS(namespaceuri, localname)
Возвращает список всех дочерних узлов с указанным именем тега в ука- занном пространстве имен. В аргументах namespaceuri и localname переда- ются строки, определяющие пространство имен и локальное имя тега соот- ветственно. Если пространство имен объявлено, как ‘www.spam.com/foo”>’
, в аргументе namespaceuri должна передаваться строка
‘http://www.spam.com/foo’
. При поиске последующих элементов ‘’ в аргументе localname должна передаваться строка ‘bar’. Возвращаемый список является объектом класса NodeList.
e.hasAttribute(name)
Возвращает True, если элемент имеет атрибут с именем name.
e.hasAttributeNS(namespaceuri, localname)
Возвращает True, если элемент имеет атрибут с именем, включающим про- странство имен namespaceuri и локальное имя localname. Аргументы имеют тот же смысл, что и в методе getElementsByTagNameNS().
e.getAttribute(name)
Возвращает значение атрибута name. Возвращаемое значение является стро- кой. Если искомый атрибут не существует, возвращается пустая строка.

Пакет xml
711
e.getAttributeNS(namespaceuri, localname)
Возвращает значение атрибута с именем, включающим пространство имен
namespaceuri
и локальное имя localname. Возвращаемое значение является строкой. Если искомый атрибут не существует, возвращается пустая стро-
. Если искомый атрибут не существует, возвращается пустая стро-
Если искомый атрибут не существует, возвращается пустая стро- ка. Аргументы имеют тот же смысл, что и в методе getElementsByTagNameNS().
Узлы типа Text
Узлы типа Text используются для представления текстовых данных. Тек- стовые данные сохраняются в атрибуте t.data объекта t типа Text. Текст, ассоциированный с тем или иным элементом документа, всегда хранится в дочерних узлах типа Text.
Вспомогательные методы
Ниже перечислены вспомогательные методы узлов. Они не являются ча- стью стандартного интерфейса DOM и предоставляются языком Python для удобства и для использования в отладочных целях.
n.toprettyxml([indent [, newl]])
Создает отформатированную разметку XML, представляющую узел n и его дочерние узлы. Аргумент indent определяет строку, которая будет исполь- зоваться при оформлении отступов. По умолчанию принимает значение
‘\t’
. Аргумент newl определяет символ перевода строки и по умолчанию имеет значение ‘\n’.
n.toxml([encoding])
Создает разметку XML, представляющую узел n и его дочерние узлы. Ар- гумент encoding определяет название кодировки (например, ‘utf-8’). Если кодировка не указана, в выходном тексте она не указывается.
n.writexml(writer [, indent [, addindent [, newl]]])
Записывает разметку XML в объект writer. В аргументе writer можно пере- дать любой объект, реализующий метод write(), совместимый с интерфей- сом файлов. Аргумент indent определяет строку, которая будет использо- ваться при оформлении отступов. Эта строка будет добавляться перед на- чалом вывода узла n. Аргумент addindent определяет строку, которая будет использоваться при оформлении отступов во время вывода дочерних узлов узла n. Аргумент newl определяет символ перевода строки.
Пример использования интерфейса DOM
Следующий пример демонстрирует использование модуля xml.dom.minidom для анализа и получения информации из XML-файла:
from xml.dom import minidom doc = minidom.parse(“recipe.xml”)
ёёё
ingredients = doc.getElementsByTagName(“ingredients”)[0]
items = ingredients.getElementsByTagName(“item”)
ёёё
for item in items:
num = item.getAttribute(“num”)

712
Глава 24. Обработка и представление данных в Интернете units = item.getAttribute(“units”)
text = item.firstChild.data.strip()
quantity = “%s %s” % (num,units)
print(“%-10s %s” % (quantity,text))
Примечание
Модуль xml.dom.minidom имеет множество других возможностей, позволяющих влиять на процесс парсинга дерева и работать с другими типами узлов XML. Допол-
XML. Допол-
. Допол- нительную информацию по этой теме можно найти в электронной документации.
Модуль xml.etree.ElementTree
М
одуль xml.etree.ElementTree содержит определение гибкого контейнерного класса ElementTree, предназначенного для хранения иерархических данных и манипулирования ими. Несмотря на то что объекты этого класса часто используются для работы с документами XML, тем не менее область при-
XML, тем не менее область при-
, тем не менее область при- менения этих объектов значительно шире – фактически они совмещают в себе возможности словаря и списка.
Объекты класса ElementTree
Класс ElementTree используется для создания нового объекта, представляю- щего верхний уровень иерархии.
ElementTree([element [, file]])
Создает новый объект класса ElementTree. В аргументе element передается экземпляр, представляющий корневой узел дерева. Этот экземпляр под- держивает интерфейс элементов, описанный ниже. В аргументе file пере- дается имя файла или объект файла, откуда будут читаться данные в фор- мате XML для заполнения дерева.
Экземпляр tree класса ElementTree обладает следующими методами:
tree._setroot(element)
Назначает element корневым элементом.
tree.find(path)
Отыскивает и возвращает первый элемент верхнего уровня в дереве, со- ответствующий критерию в аргументе path. В аргументе path передается строка, описывающая тип элемента и его положение относительно других элементов. Синтаксис аргумента path описывается в следующем списке:
Значение path
Описание

tag
Соответствует только элементам верхнего уровня с именем тега
tag
, например <tag>...tag>. Не совпадает с элементами на более низких уровнях. Элемент типа tag, находящийся внутри другого элемента, например <tag>...tag>, не соответствует данному значению аргумента path.

Пакет xml
713
Значение path
Описание

parent/tag
Соответствует элементам с именем тега tag, если они являются дочерними элементами для элементов с тегом ‘parent’. Количе- ство компонентов в аргументе path не ограничивается.
‘*’
Соответствует любым дочерним элементам. Например, значению
‘*/tag’
соответствуют все дочерние элементы с именем тега ‘tag’.
‘.’
Начинает поиск от текущего узла.
‘//’
Соответствует всем вложенным элементам на всех уровнях, ниже уровня указанного элемента. Например, значению ‘.//tag’ соответствуют все вложенные элементы с именем ‘tag’, на всех вложенных уровнях.
При работе с документами XML, в которых используются пространства имен, элемент ‘tag’ в аргументе path должен иметь вид ‘{uri}tag’, где uri – это строка, такая как ‘http://www.w3.org/TR/html4/’.
tree.findall(path)
Отыскивает все элементы верхнего уровня в дереве, соответствующие кри- терию в аргументе path, и возвращает их в том порядке, в каком они следу- ют в документе, в виде списка или итератора.
tree.findtext(path [, default])
Возвращает текстовый элемент для первого элемента верхнего уровня в де- текстовый элемент для первого элемента верхнего уровня в де- текстовый элемент для первого элемента верхнего уровня в де- элемент для первого элемента верхнего уровня в де- элемент для первого элемента верхнего уровня в де- для первого элемента верхнего уровня в де- для первого элемента верхнего уровня в де- первого элемента верхнего уровня в де- первого элемента верхнего уровня в де- элемента верхнего уровня в де- элемента верхнего уровня в де- верхнего уровня в де- верхнего уровня в де- уровня в де- уровня в де- в де- в де- де- де- реве, соответствующего критерию в аргументе path. В аргументе default передается строка, которая будет возвращена, если в дереве документа не найдется элемента, соответствующего условию.
tree.getiterator([tag])
Создает итератор, который воспроизводит все элементы в дереве, в поряд- ке их следования, имена тегов которых совпадают со значением аргумента
tag
. Если аргумент tag опущен, будут возвращены все элементы, присут- ствующие в дереве.
tree.getroot()
Возвращает корневой элемент дерева.
tree.parse(source [, parser])
Выполняет парсинг внешнего XML-документа и замещает корневой эле-
XML-документа и замещает корневой эле-
-документа и замещает корневой эле- мент полученным результатом. В аргументе source передается имя файла или объект, похожий на файл, представляющий XML-документ. В необя-
XML-документ. В необя-
-документ. В необя- зательном аргументе parser можно передать экземпляр класса TreeBuilder, который описывается ниже.
tree.write(file [, encoding])
Записывает все содержимое дерева в файл. В аргументе file передается имя файла или объект, похожий на файл, открытый для записи. В аргументе
encoding
передается название кодировки, которая будет использоваться

714
Глава 24. Обработка и представление данных в Интернете при выводе данных. Если этот аргумент опущен, используется кодиров- ка, применяемая интерпретатором по умолчанию (в большинстве случаев
‘utf-8’
или ‘ascii’).
Создание элементов
Элементы, которые могут храниться в контейнере класса ElementTree, яв- ляются экземплярами различных классов, которые создаются либо в про- цессе парсинга содержимого файла, либо с помощью следующих функций конструкторов:
Comment([text])
Создает новый элемент комментария. В аргументе text передается строка или строка байтов с текстом. При выводе этот элемент отображается в ком- ментарий XML.
Element(tag [, attrib [, **extra]])
Создает новый элемент. В аргументе tag передается имя тега элемента.
Например, чтобы создать элемент ‘....’, в аргументе tag следует передать строку ‘foo’. В аргументе attrib передается словарь атрибутов эле- мента, определяемых как строки или строки байтов. Любые дополнитель- ные именованные аргументы в extra также используются для установки значений атрибутов элемента.
fromstring(text)
Создает элемент из фрагмента разметки XML в аргументе text; так же, как и функция XML(), которая описывается ниже.
ProcessingInstruction(target [, text])
Создает новый элемент, соответствующий инструкции обработки. В аргу- аргу- аргу- ментах target и text передаются строки или строки байтов. При отображе- передаются строки или строки байтов. При отображе- строки или строки байтов. При отображе- строки или строки байтов. При отображе- или строки байтов. При отображе- или строки байтов. При отображе- строки байтов. При отображе- строки байтов. При отображе- байтов. При отображе- байтов. При отображе-
. При отображе-
При отображе- нии в разметку XML этот элемент соответствует тексту ‘target text?>’.
SubElement(parent, tag [, attrib [, **extra]])
То же, что и Element(), но автоматически добавляет новый элемент, как до- черний, в элемент parent.
XML(text)
Создает элемент из фрагмента разметки XML в аргументе text. Например, если в аргументе text передать строку ‘....’, эта функция создаст стандартный элемент с тегом ‘foo’.
XMLID(text)
То же, что и XML(text), за исключением того, что собирает все атрибуты ‘id’ и создает словарь, отображающий значения атрибутов ‘id’ в элементы. Воз- вращает кортеж (elem, idmap), где в поле elem содержится новый элемент, а в поле idmap – словарь, отображающий значения атрибутов ID. Например, вызов XMLID(‘Hello’) вернет (, {‘123’: , ‘456’: })

Пакет xml
715
Интерфейс элементов
Не смотря на то, что объекты элементов, хранящиеся в контейнере типа El- ementTree
, могут быть экземплярами разных классов, тем не менее все они имеют общий интерфейс. Элемент elem любого типа поддерживает следую- любого типа поддерживает следую- типа поддерживает следую- типа поддерживает следую- поддерживает следую- поддерживает следую- следую- следую- щие операции языка Python:
Операция
Описание
elem[n]
Возвращает n-й дочерний элемент в элементе elem.
elem[n] = newelem
Замещает n-й дочерний элемент в элементе elem новым эле- ментом newelem.
del
elem[n]
Удаляет n-й дочерний элемент из элемента elem.
len(
elem)
Возвращает количество дочерних элементов в элементе elem.
Все элементы обладают следующими атрибутами:
Атрибут
Описание
elem.tag
Строка, определяющая тип элемента. Например, для эле- мента ... атрибут tag будет иметь значение
‘foo’
elem.text
Данные, ассоциированные с элементом. Обычно – строка, содержащая текст, заключенный между открывающим и закрывающим тегами элемента XML.
elem.tail
Дополнительные данные, ассоциированные с элементом.
В случае XML в этом атрибуте обычно сохраняется текст, следующий после закрывающего тега элемента, но перед следующим тегом.
elem.attrib
Словарь с атрибутами элемента.
Элементы поддерживают следующие методы, часть которых имитируют методы словарей:
elem.append(subelement)
Добавляет элемент subelement в список дочерних элементов.
elem.clear()
Стирает всю информацию, имеющуюся в элементе, включая атрибуты, текст и дочерние элементы.
elem.find(path)
Отыскивает первый вложенный элемент, соответствующий критерию в ар- гументе path.
elem.findall(path)
Отыскивает все вложенные элементы, соответствующие критерию в аргу- менте path. Возвращает список или итерируемый объект с элементами, сле- дующими в том же порядке, в каком они присутствуют в документе.

716
Глава 24. Обработка и представление данных в Интернете
elem.findtext(path [, default])
Отыскивает текст для первого элемента, соответствующего критерию в ар- гументе path. В аргументе default передается строка, которая возвращается в случае, если метод не найдет совпадений.
elem.get(key [, default])
Извлекает значение атрибута key. В аргументе default передается значение, которое возвращается в случае, если искомый атрибут отсутствует. Если в документе используются пространства имен XML, в аргументе key долж- на передаваться строка вида ‘{uri}key’, где в поле uri передается строка, та- кая как ‘http://www.w3.org/TR/html4/’.
elem.getchildren()
Возвращает все вложенные элементы в порядке следования в документе.
elem.getiterator([tag])
Возвращает итератор, который воспроизводит все вложенные элементы с тегом tag.
elem.insert(index, subelement)
Вставляет вложенный элемент в список дочерних элементов, в позицию
index
elem.items()
Возвращает все атрибуты элемента в виде списка кортежей (name, value).
elem.keys()
Возвращает список имен всех атрибутов.
elem.remove(subelement)
Удаляет элемент subelement из списка дочерних элементов.
elem.set(key, value)
Записывает значение value в атрибут key.
Построение дерева
Объект класса ElementTree легко создается из других древовидных струк- тур. Для этой цели можно использовать объекты следующего класса.
TreeBuilder([element_factory])
Класс, позволяющий создать структуру типа ElementTree с помощью после- с помощью после- помощью после- помощью после- после- после- довательности вызовов start(), end() и data() в процессе анализа содержи- в процессе анализа содержи- процессе анализа содержи- процессе анализа содержи- анализа содержи- анализа содержи- содержи- содержи- мого файла или во время обхода другой древовидной структуры. В аргу- файла или во время обхода другой древовидной структуры. В аргу- файла или во время обхода другой древовидной структуры. В аргу- или во время обхода другой древовидной структуры. В аргу- или во время обхода другой древовидной структуры. В аргу- во время обхода другой древовидной структуры. В аргу- во время обхода другой древовидной структуры. В аргу- время обхода другой древовидной структуры. В аргу- время обхода другой древовидной структуры. В аргу- обхода другой древовидной структуры. В аргу- обхода другой древовидной структуры. В аргу- другой древовидной структуры. В аргу- другой древовидной структуры. В аргу- древовидной структуры. В аргу- древовидной структуры. В аргу- структуры. В аргу- структуры. В аргу-
. В аргу-
В аргу- менте element_factory передается функция, которая будет вызываться для создания новых экземпляров элементов.
Экземпляр t класса TreeBuilder обладает следующими методами:
t.close()
Закрывает построитель дерева и возвращает созданный объект ElementTree верхнего уровня.

Пакет xml
717
t.data(data)
Добавляет текстовые данные в текущий обрабатываемый элемент.
t.end(tag)
Закрывает текущий обрабатываемый элемент и возвращает окончатель- ный объект элемента.
t.start(tag, attrs)
Создает новый элемент. В аргументе tag передается имя элемента, а в аргу- менте attrs – словарь со значениями атрибутов.
Вспомогательные функции
Ниже перечислены вспомогательные функции, объявленные в модуле xml.
etree.ElementTree
:
dump(elem)
Выводит структуру элемента elem в поток sys.stdout для отладки. Вывод обычно имеет вид разметки XML.
iselement(elem)
Проверяет, является ли элемент elem допустимым объектом элемента.
iterparse(source [, events])
Выполняет парсинг очередного фрагмента XML с приращением, извлекая его из source. В аргументе source передается имя файла или объект, похо- передается имя файла или объект, похо- имя файла или объект, похо- имя файла или объект, похо- файла или объект, похо- файла или объект, похо- или объект, похо- или объект, похо- объект, похо- объект, похо-
, похо- похо- жий на файл, содержащий данные в формате XML. В аргументе events пе- пе- редается список типов возбуждаемых событий. К допустимым относятся типы событий: ‘start’, ‘end’, ‘start-ns’ и ‘end-ns’. Если этот аргумент опу- щен, возбуждаться будет только событие ‘end’. Функция возвращает итера- тор, который воспроизводит кортежи (event, elem), где поле event содержит строку, такую как ‘start’ или ‘end’, а поле elem – обрабатываемый элемент.
В случае события ‘start’ в кортеже возвращается только что созданный элемент, изначально пустой, за исключением атрибутов. В случае события
‘end’
возвращается полностью заполненный элемент, включая все вложен- ные элементы.
parse(source)
Полностью преобразует исходную разметку XML в объект ElementTree. В ар- гументе source передается имя файла или объект, похожий на файл, с дан- ными в формате XML.
tostring(elem)
Создает строку XML, представляющую элемент elem и все вложенные в него элементы.
Примеры обработки XML-документов
Ниже приводится пример использования класса ElementTree для парсинга
XML-файла с рецептом и вывода списка ингредиентов. Он напоминает реа-
-файла с рецептом и вывода списка ингредиентов. Он напоминает реа- напоминает реа- напоминает реа- лизацию с использованием интерфейса DOM.

718
Глава 24. Обработка и представление данных в Интернете from xml.etree.ElementTree import ElementTree
ёёё
doc = ElementTree(file=”recipe.xml”)
ingredients = doc.find(‘ingredients’)
ёёё
for item in ingredients.findall(‘item’):
num = item.get(‘num’)
units = item.get(‘units’,’’)
text = item.text.strip()
quantity = “%s %s” % (num, units)
print(“%-10s %s” % (quantity, text))
Синтаксис путей, используемый методами объекта ElementTree, облегчает и упрощает решение некоторых задач. Например, ниже приводится другая версия предыдущего примера, где использование синтаксиса путей позво- лило упростить извлечение всех элементов ....
from xml.etree.ElementTree import ElementTree
ёёё
doc = ElementTree(file=”recipe.xml”)
for item in doc.findall(“.//item”):
num = item.get(‘num’)
units = item.get(‘units’,’’)
text = item.text.strip()
quantity = “%s %s” % (num, units)
print(“%-10s %s” % (quantity, text))
Взгляните на следующий пример XML-файла ‘recipens.xml’, в котором ис- пользуются пространства имен:



Famous Guacamole


A southwest favorite!


Large avocados, chopped
...


Combine all ingredients and hand whisk to desired consistency.
Serve and enjoy with ice-cold beers.


При работе с пространствами имен проще всего использовать словарь, который отображает префиксы пространств имен в соответствующие им идентификаторы URI. Благодаря этому можно использовать операторы форматирования строк для подстановки URI, как показано ниже:
from xml.etree.ElementTree import ElementTree doc = ElementTree(file=”recipens.xml”)
ns = {

Пакет xml
719
‘r’ : ‘http://www.dabeaz.com/namespaces/recipe’
}
ingredients = doc.find(‘{%(r)s}ingredients’ % ns)
for item in ingredients.findall(‘{%(r)s}item’ % ns):
num = item.get(‘num’)
units = item.get(‘units’,’’)
text = item.text.strip()
quantity = “%s %s” % (num, units)
print(“%-10s %s” % (quantity, text))
М
одуль ElementTree отлично подходит для работы с небольшими файлами
XML, позволяя быстро загружать их в память и работать с ними. Однако допустим, что необходимо обработать огромный файл XML со следующей структурой:



Jon Wayne
...


The Dead Milkmen
...

... далее следуют описания еще 100 000 альбомов ...

Чтобы прочитать такой огромный файл целиком, потребуется значитель- ный объем памяти. Например, файл XML объемом 10 Мбайт может занять более 100 Мбайт памяти. Если необходимо извлечь информацию из тако- го огромного файла, проще всего будет использовать функцию ElementTree.
iterparse()
. Ниже приводится пример реализации итеративной обработки узлов из предыдущего файла:
from xml.etree.ElementTree import iterparse
ёёё
iparse = iterparse(“music.xml”, [‘start’,’end’])
# Отыскать элемент верхнего уровня music for event, elem in iparse:
if event == ‘start’ and elem.tag == ‘music’:
musicNode = elem break
ёёё
# Получить все альбомы albums = (elem for event, elem in iparse if event == ‘end’ and elem.tag == ‘album’)
ёёё
for album in albums:
# Обработать очередной альбом
...
musicNode.remove(album) # По завершении удалить альбом из памяти

720
Глава 24. Обработка и представление данных в Интернете
Ключом к эффективному использованию функции iterparse() является удаление данных, надобность в которых отпала. Последняя инструкция musicNode.remove(album)
в примере удаляет очередной элемент после его обработки (удаляя его из родительского элемента). Если проверить, ка- кой объем памяти потребляет предыдущая программа в процессе выпол- нения, можно обнаружить, что он совсем невелик, хотя она обрабатывает значительный объем данных.
Примечания
• Модуль ElementTree обеспечивает чрезвычайно простой и гибкий спо- соб обработки простых XML-документов на языке Python. Однако он не настолько богат возможностями, как хотелось бы. Например, он не предоставляет средств проверки корректности разметки XML и не под-
XML и не под- и не под- держивает возможность обработки некоторых сложных аспектов XML- документов, таких как объявления DTD. Для этого необходимо устанав-
DTD. Для этого необходимо устанав-
. Для этого необходимо устанав- этого необходимо устанав- этого необходимо устанав- необходимо устанав- необходимо устанав- устанав- устанав- ливать и использовать сторонние пакеты. Один из таких пакетов, lxml.
etree
(http://codespeak.net/lxml/), реализует программный интерфейс
ElementTree к популярным библиотекам libxml2 и libxslt и обеспечивает полную поддержку языков XPATH, XSLT и других возможностей.
• Модуль ElementTree сам по себе является сторонним пакетом, поддерж- кой которого занимается Фредерик Лунд (Fredrik Lundh) (домашняя страница проекта: http://effbot.org/zone/element-index.htm). На этом сайте можно найти более современные версии по сравнению с той, что включена в состав стандартной библиотеки, и предлагающие дополни- тельные возможности.
Модуль xml.sax
Модуль xml.sax обеспечивает возможность парсинга XML-документов, пре-
XML-документов, пре-
-документов, пре- доставляя интерфейс SAX2.
parse(file, handler [, error_handler])
Выполняет парсинг XML-документа file. В аргументе file передается имя файла или открытый объект файла. В аргументе handler передается объект, выполняющий обработку содержимого документа. В необязательном аргу- обработку содержимого документа. В необязательном аргу- обработку содержимого документа. В необязательном аргу- содержимого документа. В необязательном аргу- содержимого документа. В необязательном аргу- документа. В необязательном аргу- документа. В необязательном аргу-
. В необязательном аргу-
В необязательном аргу- менте error_handler передается объект, реализующий обработку ошибок, описание которого можно найти в электронной документации.
parseString(string, handler [, error_handler])
То же, что и parse(), но выполняет парсинг XML-данных в строке string.
Объекты-обработчики
Чтобы выполнить какую-либо обработку XML-документа, функции parse() или parseString() требуется передать объект-обработчик. Чтобы объявить обработчик, необходимо определить класс, производный от класса Conten- tHandler
. Экземпляр c класса ContentHandler обладает следующими метода- ми, каждый из которых можно переопределить в своем классе обработчика:

Пакет xml
721
c.characters(content)
Вызывается парсером, который передает исходные текстовые данные.
В аргументе content передается строка символов.
c.endDocument()
Вызывается парсером по достижении конца документа.
c.endElement(name)
Вызывается парсером по достижении конца элемента с именем name. На- пример, по достижении закрывающего тега ‘’ парсер вызывает этот метод и передает ему строку ‘foo’ в аргументе name.
c.endElementNS(name, qname)
Вызывается по достижении конца элемента, в теге которого используется пространство имен XML. В аргументе name передается кортеж строк (uri,
localname)
, а в аргументе qname – полностью квалифицированное имя тега.
Обычно в аргументе qname передается значение None, если поддержка пре- фиксов имен в SAX не была включена. Например, если элемент определен как ‘’, в аргументе name будет передан кортеж (u’http://spam.com’, u’bar’).
c.endPrefixMapping(prefix)
Вызывается по достижении пространства имен XML. В аргументе prefix передается имя пространства имен.
c.ignorableWhitespace(whitespace)
Вызывается при встрече в документе пустого пространства, которое долж- но игнорироваться парсером. В аргументе whitespace передается строка, со- держащая пробельные символы.
c.processingInstruction(target, data)
Вызывается, когда парсер встречает инструкцию обработки XML, за-
XML, за-
, за- ключенную в конструкцию . В аргументе target передается тип инструкции, а в аргументе data – данные инструкции. Например, для ин- струкции ‘ в аргументе
target
будет передана строка ‘xml-stylesheet’, а в аргументе data – остаток текста инструкции ‘href=”mystyle.css” type=”text/css”’.
c.setDocumentLocator(locator)
Вызывается парсером, чтобы передать объект с информацией о местополо- жении, который может использоваться для отслеживания номеров строк, символов в строке и получения другой информации. Основное назначение этого метода состоит в том, чтобы просто сохранить где-нибудь объект с ин- формацией о местоположении и обеспечить тем самым возможность вос- пользоваться им позднее, например когда потребуется вывести сообщение об ошибке. Объект с информацией о местоположении, который передается в аргументе locator, предоставляет четыре метода: getColumnNumber(), get-
LineNumber()
, getPublicId() и getSystemId(), которые могут использоваться для получения необходимой информации.

722
Глава 24. Обработка и представление данных в Интернете
c.skippedEntity(name)
Вызывается, когда парсер встречает мнемонику. В аргументе name переда- ется имя мнемоники.
c.startDocument()
Вызывается в начале документа.
c.startElement(name, attrs)
Вызывается, когда парсер встречает новый элемент XML. В аргументе name передается имя элемента, а в аргументе attrs – объект с информацией об атрибутах. Например, для XML-элемента ‘’, в аргументе name метод получит строку ‘foo’, а в аргументе attrs – объект с информацией об атрибутах bar и spam. Объект attrs обладает следующими методами, которые могут использоваться для получения информации об атрибутах:
Метод
Описание
attrs.getLength()
Возвращает количество атрибутов
attrs.getNames()
Возвращает список имен атрибутов
attrs.getType(name)
Возвращает тип атрибута name
attrs.getValue(name)
Возвращает значение атрибута name
c.startElementNS(name, qname, attrs)
Вызывается, когда парсер встречает новый элемент XML и в документе ис-
XML и в документе ис- и в документе ис- пользуются пространства имен. В аргументе name передается кортеж строк
(
uri, localname)
, а в аргументе qname – полностью квалифицированное имя тега
(обычно в аргументе qname передается значение None, если поддержка префик- сов имен в SAX2 не была включена). В аргументе attrs передается объект с ин- формацией об атрибутах. Например, для элемента ‘spam.com” blah=”whatever”>’
в аргументе name метод получит кортеж (u’http://
spam.com’, u’bar’)
, в аргументе qname – значение None и в аргументе attrs – объ- ект с информацией об атрибуте blah. Объект attrs обладает теми же методами, что и объект, который передается методу startElement(), описанному выше.
Кроме того, этот объект обладает следующими дополнительными методами, предназначенными для работы с пространствами имен:
Метод
Описание
attrs.getValueByQName(qname)
Возвращает значение атрибута с полностью квали- фицированным именем qname.
attrs.getNameByQName(qname)
Возвращает кортеж (namespace, localname) для атри- бута с полностью квалифицированным именем qname
attrs.getQNameByName(name)
Возвращает полностью квалифицированное имя для атрибута с локальным именем name
attrs.getQNames()
Возвращает полностью квалифицированные имена для всех атрибутов.

Пакет xml
723
c.startPrefixMapping(prefix, uri)
Вызывается в начале объявления пространства имен XML. Например, если элемент определен как ‘’, в аргу- менте prefix будет передана строка ‘foo’, а в аргументе uri – строка ‘http://
spam.com’
Пример
Следующий пример иллюстрирует реализацию парсера на основе интер- фейса SAX, который выводит список ингредиентов из файла рецепта, представленного ранее. Сравните его с примером из раздела с описанием модуля xml.dom.minidom.
from xml.sax import ContentHandler, parse
ёёё
class RecipeHandler(ContentHandler):
def startDocument(self):
self.initem = False def startElement(self,name,attrs):
if name == ‘item’:
self.num = attrs.get(‘num’,’1’)
self.units = attrs.get(‘units’,’none’)
self.text = []
self.initem = True def endElement(self,name):
if name == ‘item’:
text = “”.join(self.text)
if self.units == ‘none’: self.units = “”
unitstr = “%s %s” % (self.num, self.units)
print(“%-10s %s” % (unitstr,text.strip()))
self.initem = False def characters(self,data):
if self.initem:
self.text.append(data)
ёёё
parse(“recipe.xml”,RecipeHandler())
Примечания
Модуль xml.sax имеет массу дополнительных возможностей, которые могут использоваться для обработки различных типов XML-документов и созда-
XML-документов и созда-
-документов и созда- ния собственных парсеров. Например, он позволяет определять объекты- обработчики для анализа объявлений DTD и других частей документа.
Дополнительную информацию можно найти в электронной документации.
Модуль xml.sax.saxutils
Модуль xml.sax.saxutils содержит несколько вспомогательных функций и объектов, которые часто используются при реализации SAX-парсеров, но также нередко бывают полезны при решении других задач.
escape(data [, entities])
Замещает специальные символы в строке data их экранированными анало- гами. Например, символ ‘<’ замещается строкой ‘<’. В аргументе entities

724
Глава 24. Обработка и представление данных в Интернете можно передать дополнительный словарь, отображающий символы в экра- нированные последовательности. Например, если в аргументе entities пе- редать словарь { u’\xf1’ : ‘ñ’ }, функция заменит все вхождения символа с строкой ‘ñ’.
unescape(data [, entities])
Выполняет замещение экранированных последовательностей в строке data фактическими символами. Например, последовательность ‘<’ будет за- будет за- за- за- мещена символом ‘<’. В аргументе entities можно передать дополнительный словарь, отображающий мнемоники в неэкранированные символы. Сло- варь entities в этой функции является зеркальным отражением словаря, который передается функции escape(), например { ‘ñ’ : u’\xf1’ }.
quoteattr(data [, entities])
Экранирует специальные символы в строке data и при этом выполняет дополнительную обработку, которая позволяет использовать результат в качестве значения атрибута XML. Возвращаемое значение можно выво-
XML. Возвращаемое значение можно выво-
. Возвращаемое значение можно выво- дить непосредственно, как значение атрибута, например print “” % quoteattr(
somevalue)
. В аргументе entities передается словарь, пригодный для использования в вызове функции escape().
XMLGenerator([out [, encoding]])
Возвращает объект типа ContentHandler, который просто выводит данные в формате XML обратно в поток вывода в виде XML-документа. Создает ко-
XML обратно в поток вывода в виде XML-документа. Создает ко- обратно в поток вывода в виде XML-документа. Создает ко-
XML-документа. Создает ко-
-документа. Создает ко- ко- ко- пию оригинального XML-документа. Аргумент out определяет поток выво- да, по умолчанию вывод выполняется в поток sys.stdout. Аргумент encod-
ing
определяет кодировку символов и по умолчанию принимает значение
‘iso-8859-1’
. Этот объект удобно использовать при отладке программного кода, выполняющего парсинг и использующего заведомо корректный об- работчик.

1   ...   60   61   62   63   64   65   66   67   ...   82


написать администратору сайта