pyexpat.md
1> **Источник:** https://python-all.ru/2.7/library/pyexpat.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.15. [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat) – Быстрый разбор XML с помощью Expat89> **Предупреждение**10>11> Модуль `pyexpat` не защищён от вредоносных данных. Если требуется разбирать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/2.7/library/xml.html#xml-vulnerabilities).1213Новое в версии 2.0.1415Модуль [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat) представляет собой интерфейс Python к непроверяющему XML-парсеру Expat. Модуль предоставляет один тип расширения, `xmlparser`, который представляет текущее состояние XML-парсера. После создания объекта `xmlparser` различные атрибуты объекта можно установить в функции-обработчики. Когда XML-документ затем передается парсеру, функции-обработчики вызываются для символьных данных и разметки в XML-документе.1617Этот модуль использует модуль `pyexpat` для доступа к парсеру Expat. Прямое использование модуля `pyexpat` устарело.1819Этот модуль предоставляет одно исключение и один объект типа:2021#### `exception xml.parsers.expat.ExpatError`2223Исключение, возникающее, когда Expat сообщает об ошибке. См. раздел [Исключения ExpatError](https://python-all.ru/2.7/library/pyexpat.html#expaterror-objects) для получения дополнительной информации об интерпретации ошибок Expat.2425#### `exception xml.parsers.expat.error`2627Псевдоним для [`ExpatError`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ExpatError).2829#### `xml.parsers.expat.XMLParserType`3031Тип возвращаемых значений функции [`ParserCreate()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ParserCreate).3233Модуль [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat) содержит две функции:3435#### `xml.parsers.expat.ErrorString(errno)`3637Возвращает пояснительную строку для заданного номера ошибки *errno*.3839#### `xml.parsers.expat.ParserCreate([encoding[, namespace_separator]])`4041Создает и возвращает новый объект `xmlparser`. *encoding*, если указан, должен быть строкой, задающей кодировку, используемую XML-данными. Expat поддерживает не так много кодировок, как Python, и его набор кодировок не может быть расширен; он поддерживает UTF-8, UTF-16, ISO-8859-1 (Latin1) и ASCII. Если задан *encoding* [1](https://python-all.ru/2.7/library/pyexpat.html#id3), он переопределяет неявную или явную кодировку документа.4243Expat может опционально выполнять обработку пространств имен XML, что включается предоставлением значения для *namespace\_separator*. Значение должно быть строкой из одного символа; будет возбуждено [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если строка имеет недопустимую длину (`None` считается эквивалентом отсутствия). Когда обработка пространств имен включена, имена типов элементов и имена атрибутов, принадлежащие пространству имен, будут расширены. Имя элемента, передаваемое обработчикам элементов `StartElementHandler` и `EndElementHandler`, будет конкатенацией URI пространства имен, символа-разделителя пространства имен и локальной части имени. Если разделитель пространства имен является нулевым байтом (`chr(0)`), то URI пространства имен и локальная часть будут объединены без разделителя.4445Например, если *namespace\_separator* установлен в пробел (`' '`) и разбирается следующий документ:4647```xml48<?xml version="1.0"?>49<root xmlns = "http://default-namespace.org/"50 xmlns:py = "http://www.python.org/ns/">51 <py:elem1 />52 <elem2 xmlns="" />53</root>54```5556`StartElementHandler` получит следующие строки для каждого элемента:5758```python59http://default-namespace.org/ root60http://www.python.org/ns/ elem161elem262```6364Из-за ограничений в библиотеке `Expat`, используемой `pyexpat`, возвращаемый экземпляр `xmlparser` может использоваться только для разбора одного XML-документа. Вызывайте `ParserCreate` для каждого документа, чтобы получить уникальные экземпляры парсера.6566> **См. также**67>68> **[XML-парсер Expat](https://python-all.ru/2.7/library/pyexpat.html)**69>70> Домашняя страница проекта Expat.7172## 19.15.1. Объекты XMLParser7374Объекты `xmlparser` имеют следующие методы:7576#### `xmlparser.Parse(data[, isfinal])`7778Разбирает содержимое строки *data*, вызывая соответствующие функции-обработчики для обработки разобранных данных. *isfinal* должен быть истинным при последнем вызове этого метода; это позволяет разбирать один файл по частям, а не передавать несколько файлов. *data* может быть пустой строкой в любой момент.7980#### `xmlparser.ParseFile(file)`8182Разбирает XML-данные, читая из объекта *file*. *file* должен предоставлять только метод `read(nbytes)`, возвращающий пустую строку, когда данных больше нет.8384#### `xmlparser.SetBase(base)`8586Устанавливает базовый URI, используемый для разрешения относительных URI в системных идентификаторах в объявлениях. Разрешение относительных идентификаторов оставлено на усмотрение приложения: это значение будет передано как аргумент *base* в функции [`ExternalEntityRefHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler), [`NotationDeclHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.NotationDeclHandler) и [`UnparsedEntityDeclHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler).8788#### `xmlparser.GetBase()`8990Возвращает строку, содержащую базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase), или `None`, если [`SetBase()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase) не вызывался.9192#### `xmlparser.GetInputContext()`9394Возвращает входные данные, которые породили текущее событие, в виде строки. Данные находятся в кодировке сущности, содержащей текст. Если этот метод вызван, когда обработчик события не активен, возвращается значение `None`.9596Новое в версии 2.1.9798#### `xmlparser.ExternalEntityParserCreate(context, encodingencoding])`99100Создаёт «дочерний» анализатор, который можно использовать для разбора внешнего разобранного объекта, на который ссылается контент, разобранный родительским анализатором. Параметр *context* должен быть строкой, переданной функции-обработчику [`ExternalEntityRefHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler), описанной ниже. Дочерний анализатор создаётся с параметрами [`ordered_attributes`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes), [`returns_unicode`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.returns_unicode) и [`specified_attributes`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.specified_attributes), установленными в значения этого анализатора.101102#### `xmlparser.SetParamEntityParsing(flag)`103104Управляет разбором сущностей-параметров (включая внешнее подмножество DTD). Возможные значения *флаг*: `XML_PARAM_ENTITY_PARSING_NEVER`, `XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE` и `XML_PARAM_ENTITY_PARSING_ALWAYS`. Возвращает true, если установка флага прошла успешно.105106#### `xmlparser.UseForeignDTD([flag])`107108Вызов этого метода с истинным значением для *флаг* (по умолчанию) приведёт к тому, что Expat вызовет [`ExternalEntityRefHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) с [`None`](https://python-all.ru/2.7/library/constants.html#None) для всех аргументов, чтобы разрешить загрузку альтернативной DTD. Если документ не содержит объявления типа документа, [`ExternalEntityRefHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) всё равно будет вызван, но [`StartDoctypeDeclHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.StartDoctypeDeclHandler) и [`EndDoctypeDeclHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.EndDoctypeDeclHandler) вызваны не будут.109110Передача ложного значения для *флаг* отменяет предыдущий вызов, в котором передавалось истинное значение, но в остальном не имеет эффекта.111112Этот метод можно вызывать только до вызова методов [`Parse()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.Parse) или [`ParseFile()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile); если вызвать его после любого из них, будет возбуждено [`ExpatError`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ExpatError) с атрибутом [`code`](https://python-all.ru/2.7/library/code.html#module-code), установленным в `errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`.113114Новое в версии 2.3.115116Объекты `xmlparser` имеют следующие атрибуты:117118#### `xmlparser.buffer_size`119120Размер буфера, используемого, когда [`buffer_text`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) истинно. Новый размер буфера можно установить, присвоив новое целое значение этому атрибуту. При изменении размера буфер будет сброшен.121122Новое в версии 2.3.123124Изменено в версии 2.6: Теперь размер буфера можно изменить.125126#### `xmlparser.buffer_text`127128Установка этого значения в true заставляет объект `xmlparser` буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избегать многократных вызовов колбэка [`CharacterDataHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.CharacterDataHandler). Это может значительно повысить производительность, поскольку Expat обычно разбивает символьные данные на фрагменты в каждом конце строки. По умолчанию этот атрибут равен false, и его можно изменить в любое время.129130Новое в версии 2.3.131132#### `xmlparser.buffer_used`133134Если [`buffer_text`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) включено, количество байт, хранящихся в буфере. Эти байты представляют текст в кодировке UTF-8. Этот атрибут не имеет осмысленной интерпретации, когда [`buffer_text`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) равно false.135136Новое в версии 2.3.137138#### `xmlparser.ordered_attributes`139140Установка этого атрибута в ненулевое целое число приводит к тому, что атрибуты возвращаются в виде списка, а не словаря. Атрибуты представляются в порядке их появления в тексте документа. Для каждого атрибута возвращаются два элемента списка: имя атрибута и значение атрибута. (Более старые версии этого модуля также использовали этот формат.) По умолчанию этот атрибут равен false; его можно изменить в любое время.141142Новое в версии 2.1.143144#### `xmlparser.returns_unicode`145146Если этому атрибуту присвоено ненулевое целое число, функции-обработчики будут получать строки Unicode. Если [`returns_unicode`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.returns_unicode) равно [`False`](https://python-all.ru/2.7/library/constants.html#False), обработчикам будут передаваться 8-битные строки, содержащие данные в кодировке UTF-8. Это значение [`True`](https://python-all.ru/2.7/library/constants.html#True) по умолчанию, если Python собран с поддержкой Unicode.147148Изменено в версии 1.6: Может быть изменено в любое время, чтобы повлиять на тип результата.149150#### `xmlparser.specified_attributes`151152Если установить в ненулевое целое число, парсер будет сообщать только те атрибуты, которые были указаны в экземпляре документа, а не те, которые получены из объявлений атрибутов. Приложения, устанавливающие этот флаг, должны быть особенно внимательны, чтобы использовать дополнительную информацию из объявлений по мере необходимости для соблюдения стандартов поведения XML-процессоров. По умолчанию этот атрибут равен false; его можно изменить в любое время.153154Новое в версии 2.1.155156Следующие атрибуты содержат значения, относящиеся к последней ошибке, возникшей в объекте `xmlparser`, и будут иметь корректные значения только после того, как вызов `Parse()` или `ParseFile()` вызвал исключение [`xml.parsers.expat.ExpatError`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ExpatError).157158#### `xmlparser.ErrorByteIndex`159160Индекс байта, на котором произошла ошибка.161162#### `xmlparser.ErrorCode`163164Числовой код, определяющий проблему. Это значение можно передать в функцию [`ErrorString()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ErrorString) или сравнить с одной из констант, определенных в объекте `errors`.165166#### `xmlparser.ErrorColumnNumber`167168Номер столбца, на котором произошла ошибка.169170#### `xmlparser.ErrorLineNumber`171172Номер строки, в которой произошла ошибка.173174Следующие атрибуты содержат значения, относящиеся к текущей позиции разбора в объекте `xmlparser`. Во время колбэка, сообщающего о событии разбора, они указывают местоположение первого символа из последовательности, которая породила это событие. При вызове вне колбэка указанная позиция будет находиться сразу после последнего события разбора (независимо от того, был ли связанный с ним колбэк).175176Новое в версии 2.4.177178#### `xmlparser.CurrentByteIndex`179180Текущий индекс байта во входных данных парсера.181182#### `xmlparser.CurrentColumnNumber`183184Текущий номер колонки во входных данных парсера.185186#### `xmlparser.CurrentLineNumber`187188Текущий номер строки во входных данных парсера.189190Вот список обработчиков, которые можно установить. Чтобы установить обработчик на объект `xmlparser` *o*, используйте `o.handlername = func`. *handlername* должен быть взят из следующего списка, а *func* должен быть вызываемым объектом, принимающим правильное количество аргументов. Все аргументы являются строками, если не указано иное.191192#### `xmlparser.XmlDeclHandler(version, encoding, standalone)`193194Вызывается при разборе XML-декларации. XML-декларация – это (необязательное) объявление применимой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone». *version* и *encoding* будут строками того типа, который задаётся атрибутом [`returns_unicode`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.returns_unicode), а *standalone* будет `1`, если документ объявлен как standalone, `0`, если объявлен как не standalone, или `-1`, если объявление standalone опущено. Это доступно только в Expat версии 1.95.0 или новее.195196Новое в версии 2.1.197198#### `xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)`199200Вызывается, когда Expat начинает разбор объявления типа документа (`<!DOCTYPE ...`). Параметр *doctypeName* передаётся в точности так, как представлен. Параметры *systemId* и *publicId* задают системный и публичный идентификаторы, если они указаны, или `None`, если опущены. *has\_internal\_subset* будет иметь значение true, если документ содержит внутреннее подмножество объявления документа. Для этого требуется Expat версии 1.2 или новее.201202#### `xmlparser.EndDoctypeDeclHandler()`203204Вызывается, когда Expat завершил разбор объявления типа документа. Требуется Expat версии 1.2 или новее.205206#### `xmlparser.ElementDeclHandler(name, model)`207208Вызывается один раз для каждого объявления типа элемента. *name* – это имя типа элемента, а *model* – представление модели содержимого.209210#### `xmlparser.AttlistDeclHandler(elname, attname, type, default, required)`211212Вызывается для каждого объявленного атрибута типа элемента. Если в объявлении списка атрибутов объявлено три атрибута, этот обработчик вызывается три раза – по одному на каждый атрибут. *elname* – это имя элемента, к которому относится объявление, а *attname* – имя объявленного атрибута. Тип атрибута – строка, передаваемая как *type*; возможные значения: `'CDATA'`, `'ID'`, `'IDREF'`, … *default* задаёт значение по умолчанию для атрибута, используемое, когда атрибут не указан в экземпляре документа, или `None`, если значение по умолчанию отсутствует (значения `#IMPLIED`). Если атрибут обязателен для указания в экземпляре документа, *required* будет true. Требуется Expat версии 1.95.0 или новее.213214#### `xmlparser.StartElementHandler(name, attributes)`215216Вызывается в начале каждого элемента. *name* – строка, содержащая имя элемента, а *attributes* – словарь, сопоставляющий имена атрибутов с их значениями.217218#### `xmlparser.EndElementHandler(name)`219220Вызывается для конца каждого элемента.221222#### `xmlparser.ProcessingInstructionHandler(target, data)`223224Вызывается для каждой инструкции по обработке.225226#### `xmlparser.CharacterDataHandler(data)`227228Вызывается для символьных данных. Он будет вызван для обычных символьных данных, содержимого CDATA и игнорируемых пробелов. Приложения, которым необходимо различать эти случаи, могут использовать колбэки [`StartCdataSectionHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.StartCdataSectionHandler), [`EndCdataSectionHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) и [`ElementDeclHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.ElementDeclHandler) для сбора необходимой информации.229230#### `xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)`231232Вызывается для объявлений неразобранных (NDATA) сущностей. Присутствует только для версии 1.2 библиотеки Expat; для более новых версий используйте [`EntityDeclHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.EntityDeclHandler). (Базовая функция в библиотеке Expat объявлена устаревшей.)233234#### `xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)`235236Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей *value* будет строкой, содержащей объявленное содержимое сущности; для внешних сущностей это будет `None`. Параметр *notationName* будет `None` для разобранных сущностей и именем нотации для неразобранных сущностей. *is\_parameter\_entity* будет true, если сущность является параметрической, и false для общих сущностей (большинству приложений нужно иметь дело только с общими сущностями). Доступно начиная с версии 1.95.0 библиотеки Expat.237238Новое в версии 2.1.239240#### `xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)`241242Вызывается для объявлений нотации. *notationName*, *base*, *systemId* и *publicId* являются строками, если заданы. Если public identifier опущен, *publicId* будет `None`.243244#### `xmlparser.StartNamespaceDeclHandler(prefix, uri)`245246Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова [`StartElementHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.StartElementHandler) для элемента, на котором эти объявления находятся.247248#### `xmlparser.EndNamespaceDeclHandler(prefix)`249250Вызывается, когда для элемента, содержащего объявление пространства имён, достигнут закрывающий тег. Этот вызов производится один раз для каждого объявления пространства имён в элементе, в порядке, обратном тому, в котором [`StartNamespaceDeclHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.StartNamespaceDeclHandler) вызывался для обозначения начала области видимости каждого объявления. Вызовы этого обработчика происходят после соответствующего [`EndElementHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.EndElementHandler) для конца элемента.251252#### `xmlparser.CommentHandler(data)`253254Вызывается для комментариев. *data* – текст комментария, без начальных `'<!-``-'` и конечных `'-``->'`.255256#### `xmlparser.StartCdataSectionHandler()`257258Вызывается в начале секции CDATA. Этот обработчик и [`EndCdataSectionHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) нужны, чтобы можно было определить синтаксическое начало и конец секций CDATA.259260#### `xmlparser.EndCdataSectionHandler()`261262Вызывается в конце секции CDATA.263264#### `xmlparser.DefaultHandler(data)`265266Вызывается для любых символов в XML-документе, для которых не был указан подходящий обработчик. Это символы, которые являются частью конструкции, о которой можно было бы сообщить, но для которой не предоставлен обработчик.267268#### `xmlparser.DefaultHandlerExpand(data)`269270То же, что и [`DefaultHandler()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), но не подавляет раскрытие внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.271272#### `xmlparser.NotStandaloneHandler()`273274Вызывается, если XML-документ не был объявлен как самостоятельный (standalone). Это происходит, когда присутствует внешнее подмножество или ссылка на параметрическую сущность, но объявление XML не устанавливает standalone равным `yes`. Если этот обработчик возвращает `0`, то синтаксический анализатор вызовет ошибку `XML_ERROR_NOT_STANDALONE`. Если обработчик не задан, в этом случае анализатор не генерирует исключение.275276#### `xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)`277278Вызывается для ссылок на внешние сущности. *base* – текущий базовый адрес, заданный предыдущим вызовом [`SetBase()`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase). Публичный и системный идентификаторы, *systemId* и *publicId*, являются строками, если заданы; если публичный идентификатор не задан, *publicId* будет `None`. Значение *context* непрозрачно и должно использоваться только так, как описано ниже.279280Чтобы внешние сущности были разобраны, этот обработчик должен быть реализован. Он отвечает за создание подчиненного анализатора с помощью `ExternalEntityParserCreate(context)`, его инициализацию соответствующими колбэками и разбор сущности. Обработчик должен возвращать целое число; если возвращается `0`, анализатор вызовет ошибку `XML_ERROR_EXTERNAL_ENTITY_HANDLING`, в противном случае разбор продолжится.281282Если этот обработчик не предоставлен, внешние сущности сообщаются через колбэк [`DefaultHandler`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), если он задан.283284## 19.15.2. Исключения ExpatError285286Исключения [`ExpatError`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ExpatError) имеют несколько интересных атрибутов:287288#### `ExpatError.code`289290Внутренний номер ошибки Expat для конкретной ошибки. Он будет соответствовать одной из констант, определённых в объекте `errors` из этого модуля.291292Новое в версии 2.1.293294#### `ExpatError.lineno`295296Номер строки, в которой обнаружена ошибка. Первая строка нумеруется как `1`.297298Новое в версии 2.1.299300#### `ExpatError.offset`301302Смещение символов внутри строки, где произошла ошибка. Первый столбец нумеруется как `0`.303304Новое в версии 2.1.305306## 19.15.3. Пример307308Следующая программа определяет три обработчика, которые просто выводят свои аргументы.309310```python311import xml.parsers.expat312313# 3 функции-обработчика314def start_element(name, attrs):315 print 'Start element:', name, attrs316def end_element(name):317 print 'End element:', name318def char_data(data):319 print 'Character data:', repr(data)320321p = xml.parsers.expat.ParserCreate()322323p.StartElementHandler = start_element324p.EndElementHandler = end_element325p.CharacterDataHandler = char_data326327p.Parse("""<?xml version="1.0"?>328<parent id="top"><child1 name="paul">Text goes here</child1>329<child2 name="fred">More text</child2>330</parent>""", 1)331```332333Результат работы этой программы:334335```python336Start element: parent {'id': 'top'}337Start element: child1 {'name': 'paul'}338Character data: 'Text goes here'339End element: child1340Character data: '\n'341Start element: child2 {'name': 'fred'}342Character data: 'More text'343End element: child2344Character data: '\n'345End element: parent346```347348## 19.15.4. Описания моделей содержимого349350Модели содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы – это просто дополнительные описания моделей содержимого.351352Значения первых двух полей – это константы, определённые в объекте `model` модуля [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat). Эти константы можно разделить на две группы: группа типов моделей и группа квантификаторов.353354Константы группы типов моделей:355356#### `xml.parsers.expat.XML_CTYPE_ANY`357358Элемент, названный именем модели, был объявлен как имеющий модель содержимого `ANY`.359360#### `xml.parsers.expat.XML_CTYPE_CHOICE`361362Именованный элемент допускает выбор из нескольких вариантов; это используется для моделей содержимого, таких как `(A | B | C)`.363364#### `xml.parsers.expat.XML_CTYPE_EMPTY`365366Элементы, объявленные как `EMPTY`, имеют этот тип модели.367368#### `xml.parsers.expat.XML_CTYPE_MIXED`369370#### `xml.parsers.expat.XML_CTYPE_NAME`371372#### `xml.parsers.expat.XML_CTYPE_SEQ`373374Модели, представляющие последовательность моделей, следующих одна за другой, обозначаются этим типом. Это используется для моделей, таких как `(A, B, C)`.375376Константы группы квантификаторов:377378#### `xml.parsers.expat.XML_CQUANT_NONE`379380Модификатор не указан, поэтому элемент может появиться ровно один раз, как в `A`.381382#### `xml.parsers.expat.XML_CQUANT_OPT`383384Модель необязательна: может появиться один раз или не появиться вовсе, как в `A?`.385386#### `xml.parsers.expat.XML_CQUANT_PLUS`387388Модель должна встречаться один или более раз (как `A+`).389390#### `xml.parsers.expat.XML_CQUANT_REP`391392Модель должна встречаться ноль или более раз, как в `A*`.393394## 19.15.5. Константы ошибок Expat395396Следующие константы предоставляются в объекте `errors` модуля [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat). Эти константы полезны при интерпретации некоторых атрибутов объектов исключения [`ExpatError`](https://python-all.ru/2.7/library/pyexpat.html#xml.parsers.expat.ExpatError), возникающих при возникновении ошибки.397398Объект `errors` имеет следующие атрибуты:399400#### `xml.parsers.expat.XML_ERROR_ASYNC_ENTITY`401402#### `xml.parsers.expat.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`403404Ссылка на сущность в значении атрибута указывала на внешнюю сущность вместо внутренней.405406#### `xml.parsers.expat.XML_ERROR_BAD_CHAR_REF`407408Ссылка на символ указывала на символ, недопустимый в XML (например, символ `0` или ‘`�`’).409410#### `xml.parsers.expat.XML_ERROR_BINARY_ENTITY_REF`411412Ссылка на сущность указывала на сущность, объявленную с помощью нотации, поэтому её невозможно разобрать.413414#### `xml.parsers.expat.XML_ERROR_DUPLICATE_ATTRIBUTE`415416Атрибут был использован более одного раза в одном открывающем теге.417418#### `xml.parsers.expat.XML_ERROR_INCORRECT_ENCODING`419420#### `xml.parsers.expat.XML_ERROR_INVALID_TOKEN`421422Возникает, когда входной байт не удаётся правильно сопоставить с символом; например, нулевой байт (значение `0`) во входном потоке UTF-8.423424#### `xml.parsers.expat.XML_ERROR_JUNK_AFTER_DOC_ELEMENT`425426После корневого элемента встретилось что-то, кроме пробельных символов.427428#### `xml.parsers.expat.XML_ERROR_MISPLACED_XML_PI`429430Объявление XML обнаружено не в начале входных данных.431432#### `xml.parsers.expat.XML_ERROR_NO_ELEMENTS`433434Документ не содержит ни одного элемента (XML требует, чтобы каждый документ содержал ровно один корневой элемент).435436#### `xml.parsers.expat.XML_ERROR_NO_MEMORY`437438Expat не смог выделить память внутри себя.439440#### `xml.parsers.expat.XML_ERROR_PARAM_ENTITY_REF`441442Ссылка на параметрическую сущность обнаружена там, где она не допускается.443444#### `xml.parsers.expat.XML_ERROR_PARTIAL_CHAR`445446Во входных данных обнаружен неполный символ.447448#### `xml.parsers.expat.XML_ERROR_RECURSIVE_ENTITY_REF`449450Ссылка на сущность содержала другую ссылку на ту же самую сущность; возможно, через другое имя, и возможно, косвенную.451452#### `xml.parsers.expat.XML_ERROR_SYNTAX`453454Обнаружена некоторая неопределённая синтаксическая ошибка.455456#### `xml.parsers.expat.XML_ERROR_TAG_MISMATCH`457458Закрывающий тег не соответствует самому внутреннему открытому открывающему тегу.459460#### `xml.parsers.expat.XML_ERROR_UNCLOSED_TOKEN`461462Какой-то токен (например, открывающий тег) не был закрыт до конца потока или до встречи следующего токена.463464#### `xml.parsers.expat.XML_ERROR_UNDEFINED_ENTITY`465466Ссылка на неопределённую сущность.467468#### `xml.parsers.expat.XML_ERROR_UNKNOWN_ENCODING`469470Кодировка документа не поддерживается Expat.471472#### `xml.parsers.expat.XML_ERROR_UNCLOSED_CDATA_SECTION`473474Раздел CDATA не был закрыт.475476#### `xml.parsers.expat.XML_ERROR_EXTERNAL_ENTITY_HANDLING`477478#### `xml.parsers.expat.XML_ERROR_NOT_STANDALONE`479480Парсер определил, что документ не является «standalone», хотя в XML-декларации он объявлен таковым, и `NotStandaloneHandler` был установлен и вернул `0`.481482#### `xml.parsers.expat.XML_ERROR_UNEXPECTED_STATE`483484#### `xml.parsers.expat.XML_ERROR_ENTITY_DECLARED_IN_PE`485486#### `xml.parsers.expat.XML_ERROR_FEATURE_REQUIRES_XML_DTD`487488Запрошена операция, требующая встроенной поддержки DTD, но Expat скомпилирован без неё. Стандартная сборка модуля [`xml.parsers.expat`](https://python-all.ru/2.7/library/pyexpat.html#module-xml.parsers.expat) никогда не должна выдавать эту ошибку.489490#### `xml.parsers.expat.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`491492После начала разбора была запрошена смена поведения, которая возможна только до его начала. В настоящее время это возбуждается только `UseForeignDTD()`.493494#### `xml.parsers.expat.XML_ERROR_UNBOUND_PREFIX`495496При включённой обработке пространств имён обнаружен необъявленный префикс.497498#### `xml.parsers.expat.XML_ERROR_UNDECLARING_PREFIX`499500Документ пытается удалить объявление пространства имён, связанное с префиксом.501502#### `xml.parsers.expat.XML_ERROR_INCOMPLETE_PE`503504Параметрическая сущность содержит неполную разметку.505506#### `xml.parsers.expat.XML_ERROR_XML_DECL`507508В документе отсутствует корневой элемент.509510#### `xml.parsers.expat.XML_ERROR_TEXT_DECL`511512Ошибка при разборе текстовой декларации во внешней сущности.513514#### `xml.parsers.expat.XML_ERROR_PUBLICID`515516В публичном идентификаторе обнаружены недопустимые символы.517518#### `xml.parsers.expat.XML_ERROR_SUSPENDED`519520Запрошенная операция выполнена на приостановленном парсере, но не разрешена. Сюда входят попытки передать дополнительные данные или остановить парсер.521522#### `xml.parsers.expat.XML_ERROR_NOT_SUSPENDED`523524Попытка возобновить работу парсера, когда он не был приостановлен.525526#### `xml.parsers.expat.XML_ERROR_ABORTED`527528Это не должно сообщаться приложениям Python.529530#### `xml.parsers.expat.XML_ERROR_FINISHED`531532Попытка выполнить операцию над парсером, который уже закончил разбор входных данных, но такая операция запрещена. Сюда относятся попытки передать дополнительные данные или остановить парсер.533534#### `xml.parsers.expat.XML_ERROR_SUSPEND_PE`535536Сноски537538**[1](https://python-all.ru/2.7/library/pyexpat.html#id1)**539540Строка кодировки, указанная в XML-выводе, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/2.7/library/pyexpat.html) и [https://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/2.7/library/pyexpat.html).541