Документация Python неофициальный перевод

pyexpat.md

528 строк · 45.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/pyexpat.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.13. [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) – Быстрый синтаксический анализ XML с помощью Expat89> **Предупреждение**10>11> Модуль `pyexpat` не является безопасным для злонамеренно сконструированных данных. Если необходимо обрабатывать ненадёжные или непроверенные данные, обратитесь к разделу [*уязвимости XML*](https://python-all.ru/3.4/library/xml.html#xml-vulnerabilities).1213Модуль [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) является интерфейсом Python к непроверяющему XML-парсеру Expat. Модуль предоставляет единственный тип расширения, `xmlparser`, который представляет текущее состояние XML-парсера. После создания объекта `xmlparser` различные атрибуты объекта могут быть установлены для функций-обработчиков. Когда XML-документ затем подаётся в парсер, функции-обработчики вызываются для символьных данных и разметки в XML-документе.1415Этот модуль использует модуль `pyexpat` для обеспечения доступа к парсеру Expat. Прямое использование модуля `pyexpat` устарело.1617Этот модуль предоставляет одно исключение и один объект типа:1819#### `exception xml.parsers.expat.ExpatError`2021Исключение, возникающее, когда Expat сообщает об ошибке. См. раздел [*Исключения ExpatError*](https://python-all.ru/3.4/library/pyexpat.html#expaterror-objects) для получения дополнительной информации об интерпретации ошибок Expat.2223#### `exception xml.parsers.expat.error`2425Псевдоним для [`ExpatError`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ExpatError).2627#### `xml.parsers.expat.XMLParserType`2829Тип возвращаемых значений функции [`ParserCreate()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ParserCreate).3031Модуль [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) содержит две функции:3233#### `xml.parsers.expat.ErrorString(errno)`3435Возвращает пояснительную строку для заданного номера ошибки *errno*.3637#### `xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None)`3839Создаёт и возвращает новый объект `xmlparser`. Параметр *encoding*, если указан, должен быть строкой, задающей кодировку, используемую XML-данными. Expat поддерживает не так много кодировок, как Python, и его набор кодировок не может быть расширен; он поддерживает UTF-8, UTF-16, ISO-8859-1 (Latin1) и ASCII. Если *encoding* [\[1\]](https://python-all.ru/3.4/library/pyexpat.html#id3) задан, он переопределяет неявную или явную кодировку документа.4041Expat может опционально выполнять обработку пространств имён XML, для чего необходимо указать значение для параметра *namespace\_separator*. Значение должно быть строкой из одного символа; если строка имеет недопустимую длину, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) (`None` считается эквивалентом отсутствия значения). Когда обработка пространств имён включена, имена типов элементов и имена атрибутов, принадлежащие пространству имён, будут расширяться. Имя элемента, передаваемое обработчикам элементов `StartElementHandler` и `EndElementHandler`, будет конкатенацией URI пространства имён, символа разделителя пространства имён и локальной части имени. Если разделитель пространства имён – нулевой байт (`chr(0)`), то URI пространства имён и локальная часть объединяются без разделителя.4243Например, если *namespace\_separator* установлен в пробел (`' '`) и разбирается следующий документ:4445```python46<?xml version="1.0"?>47<root xmlns    = "http://default-namespace.org/"48      xmlns:py = "http://www.python.org/ns/">49  <py:elem1 />50  <elem2 xmlns="" />51</root>52```5354`StartElementHandler` будет получать следующие строки для каждого элемента:5556```python57http://default-namespace.org/ root58http://www.python.org/ns/ elem159elem260```6162Из-за ограничений библиотеки `Expat`, используемой модулем `pyexpat`, возвращаемый экземпляр `xmlparser` может использоваться только для синтаксического анализа одного XML-документа. Вызывайте `ParserCreate` для каждого документа, чтобы получить уникальные экземпляры парсера.6364> **См. также**65>66> **[XML-парсер Expat](https://python-all.ru/3.4/library/pyexpat.html)**67>68> Домашняя страница проекта Expat.6970## 20.13.1. Объекты XMLParser7172Объекты `xmlparser` имеют следующие методы:7374#### `xmlparser.Parse(data[, isfinal])`7576Разбирает содержимое строки *data*, вызывая соответствующие функции-обработчики для обработки разобранных данных. *isfinal* должен быть истинным при последнем вызове этого метода; это позволяет разбирать один файл по частям, а не передавать несколько файлов. *data* может быть пустой строкой в любой момент.7778#### `xmlparser.ParseFile(file)`7980Выполняет синтаксический анализ XML-данных, считывая их из объекта *file*. Объект *file* должен предоставлять только метод `read(nbytes)`, который возвращает пустую строку, когда данные закончились.8182#### `xmlparser.SetBase(base)`8384Устанавливает базовый URI, используемый для разрешения относительных URI в системных идентификаторах в объявлениях. Разрешение относительных идентификаторов оставлено на усмотрение приложения: это значение будет передаваться в качестве аргумента *base* функциям [`ExternalEntityRefHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler), [`NotationDeclHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.NotationDeclHandler) и [`UnparsedEntityDeclHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler).8586#### `xmlparser.GetBase()`8788Возвращает строку, содержащую базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase), или `None`, если [`SetBase()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase) не вызывался.8990#### `xmlparser.GetInputContext()`9192Возвращает входные данные, которые породили текущее событие, в виде строки. Данные представлены в кодировке сущности, содержащей текст. Если метод вызван, когда обработчик события не активен, возвращается `None`.9394#### `xmlparser.ExternalEntityParserCreate(context[, encoding])`9596Create a “child” parser which can be used to parse an external parsed entity referred to by content parsed by the parent parser. The *context* parameter should be the string passed to the [`ExternalEntityRefHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) handler function, described below. The child parser is created with the [`ordered_attributes`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes) and [`specified_attributes`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.specified_attributes) set to the values of this parser.9798#### `xmlparser.SetParamEntityParsing(flag)`99100Управляет синтаксическим анализом параметрических сущностей (включая внешнее подмножество DTD). Возможные значения *flag*: `XML_PARAM_ENTITY_PARSING_NEVER`, `XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE` и `XML_PARAM_ENTITY_PARSING_ALWAYS`. Возвращает true, если установка флага прошла успешно.101102#### `xmlparser.UseForeignDTD([flag])`103104Вызов этого с истинным значением для *flag* (по умолчанию) заставит Expat вызывать [`ExternalEntityRefHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) с [`None`](https://python-all.ru/3.4/library/constants.html#None) для всех аргументов, чтобы разрешить загрузку альтернативного DTD. Если документ не содержит объявления типа документа, [`ExternalEntityRefHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) всё равно будет вызван, но [`StartDoctypeDeclHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.StartDoctypeDeclHandler) и [`EndDoctypeDeclHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.EndDoctypeDeclHandler) вызываться не будут.105106Передача ложного значения для *флаг* отменяет предыдущий вызов, в котором передавалось истинное значение, но в остальном не имеет эффекта.107108Этот метод можно вызывать только до того, как будут вызваны методы [`Parse()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.Parse) или [`ParseFile()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile); вызов после вызова любого из них приводит к возникновению [`ExpatError`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ExpatError) с атрибутом [`code`](https://python-all.ru/3.4/library/code.html#module-code), установленным в `errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]`.109110Объекты `xmlparser` имеют следующие атрибуты:111112#### `xmlparser.buffer_size`113114Размер буфера, используемого, когда [`buffer_text`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) имеет значение true. Новый размер буфера можно задать, присвоив этому атрибуту новое целочисленное значение. При изменении размера буфер будет сброшен.115116#### `xmlparser.buffer_text`117118Установка этого атрибута в true заставляет объект `xmlparser` буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избежать множественных вызовов колбэка [`CharacterDataHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.CharacterDataHandler). Это может значительно повысить производительность, поскольку Expat обычно разбивает символьные данные на фрагменты на каждом конце строки. По умолчанию этот атрибут имеет значение false, и его можно изменить в любое время.119120#### `xmlparser.buffer_used`121122Если [`buffer_text`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) включён, то это количество байтов, хранящихся в буфере. Эти байты представляют текст в кодировке UTF-8. Этот атрибут не имеет осмысленной интерпретации, когда [`buffer_text`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) имеет значение false.123124#### `xmlparser.ordered_attributes`125126Установка этого атрибута в ненулевое целое число приводит к тому, что атрибуты возвращаются в виде списка, а не словаря. Атрибуты представляются в порядке их появления в тексте документа. Для каждого атрибута возвращаются два элемента списка: имя атрибута и значение атрибута. (Более старые версии этого модуля также использовали этот формат.) По умолчанию этот атрибут равен false; его можно изменить в любое время.127128#### `xmlparser.specified_attributes`129130Если установить в ненулевое целое число, парсер будет сообщать только те атрибуты, которые были указаны в экземпляре документа, а не те, которые получены из объявлений атрибутов. Приложения, устанавливающие этот флаг, должны быть особенно внимательны, чтобы использовать дополнительную информацию из объявлений по мере необходимости для соблюдения стандартов поведения XML-процессоров. По умолчанию этот атрибут равен false; его можно изменить в любое время.131132Следующие атрибуты содержат значения, относящиеся к самой последней ошибке, возникшей в объекте `xmlparser`, и будут иметь корректные значения только после того, как вызов `Parse()` или `ParseFile()` возбудит исключение [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ExpatError).133134#### `xmlparser.ErrorByteIndex`135136Индекс байта, на котором произошла ошибка.137138#### `xmlparser.ErrorCode`139140Числовой код, указывающий на проблему. Это значение можно передать функции [`ErrorString()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ErrorString) или сравнить с одной из констант, определённых в объекте `errors`.141142#### `xmlparser.ErrorColumnNumber`143144Номер столбца, на котором произошла ошибка.145146#### `xmlparser.ErrorLineNumber`147148Номер строки, в которой произошла ошибка.149150Следующие атрибуты содержат значения, относящиеся к текущей позиции разбора в объекте `xmlparser`. Во время колбэка, сообщающего о событии разбора, они указывают местоположение первого символа из последовательности символов, которая породила это событие. При вызове вне колбэка указанная позиция будет находиться сразу после последнего события разбора (независимо от того, был ли связанный с ним колбэк).151152#### `xmlparser.CurrentByteIndex`153154Текущий индекс байта во входных данных парсера.155156#### `xmlparser.CurrentColumnNumber`157158Текущий номер колонки во входных данных парсера.159160#### `xmlparser.CurrentLineNumber`161162Текущий номер строки во входных данных парсера.163164Вот список обработчиков, которые можно установить. Чтобы установить обработчик на объект `xmlparser` *o*, используйте `o.handlername = func`. *handlername* должно быть взято из следующего списка, а *func* должен быть вызываемым объектом, принимающим правильное количество аргументов. Если не указано иное, все аргументы являются строками.165166#### `xmlparser.XmlDeclHandler(version, encoding, standalone)`167168Вызывается при разборе XML-декларации. XML-декларация – это (необязательное) объявление используемой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone». *version* и *encoding* будут строками, а *standalone* будет `1`, если документ объявлен как standalone, `0`, если объявлено, что он не является standalone, или `-1`, если атрибут standalone был опущен. Доступно только в Expat версии 1.95.0 или новее.169170#### `xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)`171172Вызывается, когда Expat начинает разбор объявления типа документа (`<!DOCTYPE ...`). Параметр *doctypeName* предоставляется точно так, как он представлен. Параметры *systemId* и *publicId* задают системный и публичный идентификаторы, если они указаны, или `None`, если опущены. Параметр *has\_internal\_subset* будет иметь значение true, если документ содержит внутреннее подмножество объявления документа. Требуется Expat версии 1.2 или новее.173174#### `xmlparser.EndDoctypeDeclHandler()`175176Вызывается, когда Expat завершил разбор объявления типа документа. Требуется Expat версии 1.2 или новее.177178#### `xmlparser.ElementDeclHandler(name, model)`179180Вызывается один раз для каждого объявления типа элемента. *name* – это имя типа элемента, а *model* – представление модели содержимого.181182#### `xmlparser.AttlistDeclHandler(elname, attname, type, default, required)`183184Вызывается для каждого объявленного атрибута типа элемента. Если в объявлении списка атрибутов объявлено три атрибута, этот обработчик вызывается три раза, по одному на каждый атрибут. *elname* – это имя элемента, к которому относится объявление, а *attname* – имя объявленного атрибута. Тип атрибута – это строка, передаваемая как *type*; возможные значения: `'CDATA'`, `'ID'`, `'IDREF'`, ... *default* задаёт значение по умолчанию для атрибута, используемое, когда атрибут не указан в экземпляре документа, или `None`, если значения по умолчанию нет (значения `#IMPLIED`). Если атрибут требуется указывать в экземпляре документа, *required* будет иметь значение true. Требуется Expat версии 1.95.0 или новее.185186#### `xmlparser.StartElementHandler(name, attributes)`187188Вызывается для начала каждого элемента. *name* – это строка, содержащая имя элемента, а *attributes* – атрибуты элемента. Если [`ordered_attributes`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes) имеет значение true, это список (см. [`ordered_attributes`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes) для полного описания). В противном случае это словарь, сопоставляющий имена со значениями.189190#### `xmlparser.EndElementHandler(name)`191192Вызывается для конца каждого элемента.193194#### `xmlparser.ProcessingInstructionHandler(target, data)`195196Вызывается для каждой инструкции по обработке.197198#### `xmlparser.CharacterDataHandler(data)`199200Вызывается для символьных данных. Будет вызываться для обычных символьных данных, CDATA-разметки и игнорируемых пробелов. Приложения, которые должны различать эти случаи, могут использовать колбэки [`StartCdataSectionHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.StartCdataSectionHandler), [`EndCdataSectionHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) и [`ElementDeclHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.ElementDeclHandler) для сбора необходимой информации.201202#### `xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)`203204Вызывается для объявлений неразобранных (NDATA) сущностей. Доступно только для версии 1.2 библиотеки Expat; для более новых версий используйте [`EntityDeclHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.EntityDeclHandler). (Соответствующая функция в библиотеке Expat признана устаревшей.)205206#### `xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)`207208Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей *value* будет строкой, содержащей объявленное содержимое сущности; для внешних сущностей этот параметр будет равен `None`. Параметр *notationName* будет равен `None` для разобранных сущностей и имени нотации для неразобранных сущностей. Параметр *is\_parameter\_entity* будет истинным, если сущность является параметрической, и ложным для общих сущностей (большинству приложений нужно работать только с общими сущностями). Это доступно только начиная с версии 1.95.0 библиотеки Expat.209210#### `xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)`211212Вызывается для объявлений нотаций. Параметры *notationName*, *base*, *systemId* и *publicId*, если заданы, являются строками. Если публичный идентификатор опущен, *publicId* будет равен `None`.213214#### `xmlparser.StartNamespaceDeclHandler(prefix, uri)`215216Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова [`StartElementHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.StartElementHandler) для элемента, в котором эти объявления расположены.217218#### `xmlparser.EndNamespaceDeclHandler(prefix)`219220Вызывается при достижении закрывающего тега элемента, содержавшего объявление пространства имён. Этот обработчик вызывается один раз для каждого объявления пространства имён в элементе в порядке, обратном тому, в котором вызывался [`StartNamespaceDeclHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.StartNamespaceDeclHandler) для указания начала области действия каждого объявления пространства имён. Вызовы этого обработчика производятся после соответствующего [`EndElementHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.EndElementHandler) для окончания элемента.221222#### `xmlparser.CommentHandler(data)`223224Вызывается для комментариев. *data* – текст комментария, без начальных `'<!-``-'` и конечных `'-``->'`.225226#### `xmlparser.StartCdataSectionHandler()`227228Вызывается в начале секции CDATA. Этот обработчик и [`EndCdataSectionHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) необходимы для определения синтаксического начала и конца секций CDATA.229230#### `xmlparser.EndCdataSectionHandler()`231232Вызывается в конце секции CDATA.233234#### `xmlparser.DefaultHandler(data)`235236Вызывается для любых символов в XML-документе, для которых не был указан подходящий обработчик. Это символы, которые являются частью конструкции, о которой можно было бы сообщить, но для которой не предоставлен обработчик.237238#### `xmlparser.DefaultHandlerExpand(data)`239240Это то же самое, что и [`DefaultHandler()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), но не препятствует разворачиванию внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.241242#### `xmlparser.NotStandaloneHandler()`243244Вызывается, если XML-документ не был объявлен как автономный (standalone). Это происходит, когда присутствует внешнее подмножество или ссылка на параметрическую сущность, но в XML-декларации не указано standalone="`yes`". Если этот обработчик возвращает `0`, то анализатор вызовет ошибку `XML_ERROR_NOT_STANDALONE`. Если обработчик не установлен, анализатор не возбуждает исключение в этой ситуации.245246#### `xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)`247248Вызывается для ссылок на внешние сущности. Параметр *base* – это текущий базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase). Публичный и системный идентификаторы *systemId* и *publicId*, если заданы, являются строками; если публичный идентификатор не задан, *publicId* будет равен `None`. Значение *context* является непрозрачным и должно использоваться только так, как описано ниже.249250Для разбора внешних сущностей этот обработчик должен быть реализован. Он отвечает за создание под-анализатора с помощью `ExternalEntityParserCreate(context)`, его инициализацию соответствующими колбэками и разбор сущности. Этот обработчик должен возвращать целое число; если он возвращает `0`, анализатор возбудит ошибку `XML_ERROR_EXTERNAL_ENTITY_HANDLING`, в противном случае разбор продолжится.251252Если этот обработчик не предоставлен, внешние сущности сообщаются через колбэк [`DefaultHandler`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), если он установлен.253254## 20.13.2. Исключения ExpatError255256Исключения [`ExpatError`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.ExpatError) имеют ряд интересных атрибутов:257258#### `ExpatError.code`259260Внутренний номер ошибки Expat для конкретной ошибки. Словарь [`errors.messages`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.errors.messages) сопоставляет эти номера с сообщениями об ошибках Expat. Например:261262```python263from xml.parsers.expat import ParserCreate, ExpatError, errors264265p = ParserCreate()266try:267    p.Parse(some_xml_document)268except ExpatError as err:269    print("Error:", errors.messages[err.code])270```271272Модуль [`errors`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat.errors) также предоставляет константы сообщений об ошибках и словарь [`codes`](https://python-all.ru/3.4/library/pyexpat.html#xml.parsers.expat.errors.codes), сопоставляющий эти сообщения с кодами ошибок, см. ниже.273274#### `ExpatError.lineno`275276Номер строки, в которой обнаружена ошибка. Первая строка нумеруется как `1`.277278#### `ExpatError.offset`279280Смещение символов внутри строки, где произошла ошибка. Первый столбец нумеруется как `0`.281282## 20.13.3. Пример283284Следующая программа определяет три обработчика, которые просто выводят свои аргументы.285286```python287import xml.parsers.expat288289# 3 функции-обработчика290def start_element(name, attrs):291    print('Start element:', name, attrs)292def end_element(name):293    print('End element:', name)294def char_data(data):295    print('Character data:', repr(data))296297p = xml.parsers.expat.ParserCreate()298299p.StartElementHandler = start_element300p.EndElementHandler = end_element301p.CharacterDataHandler = char_data302303p.Parse("""<?xml version="1.0"?>304<parent id="top"><child1 name="paul">Text goes here</child1>305<child2 name="fred">More text</child2>306</parent>""", 1)307```308309Результат работы этой программы:310311```python312Start element: parent {'id': 'top'}313Start element: child1 {'name': 'paul'}314Character data: 'Text goes here'315End element: child1316Character data: '\n'317Start element: child2 {'name': 'fred'}318Character data: 'More text'319End element: child2320Character data: '\n'321End element: parent322```323324## 20.13.4. Описания моделей содержимого325326Модули содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы – это просто дополнительные описания модулей содержимого.327328Значения первых двух полей – это константы, определённые в модуле [`xml.parsers.expat.model`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat.model). Эти константы можно разделить на две группы: группа типов модели и группа квантификаторов.329330Константы группы типов моделей:331332#### `xml.parsers.expat.model.XML_CTYPE_ANY`333334Элемент, названный именем модели, был объявлен с моделью содержимого `ANY`.335336#### `xml.parsers.expat.model.XML_CTYPE_CHOICE`337338Именованный элемент допускает выбор из нескольких вариантов; это используется для моделей содержимого, таких как `(A | B | C)`.339340#### `xml.parsers.expat.model.XML_CTYPE_EMPTY`341342Элементы, объявленные как `EMPTY`, имеют этот тип модели.343344#### `xml.parsers.expat.model.XML_CTYPE_MIXED`345346#### `xml.parsers.expat.model.XML_CTYPE_NAME`347348#### `xml.parsers.expat.model.XML_CTYPE_SEQ`349350Модели, представляющие последовательность моделей, следующих одна за другой, обозначаются этим типом модели. Это используется для моделей, таких как `(A, B, C)`.351352Константы группы квантификаторов:353354#### `xml.parsers.expat.model.XML_CQUANT_NONE`355356Модификатор не указан, поэтому элемент может появиться ровно один раз, как для `A`.357358#### `xml.parsers.expat.model.XML_CQUANT_OPT`359360Модель является необязательной: она может появиться один раз или не появиться вовсе, как для `A?`.361362#### `xml.parsers.expat.model.XML_CQUANT_PLUS`363364Модель должна встречаться один или более раз (как `A+`).365366#### `xml.parsers.expat.model.XML_CQUANT_REP`367368Модель должна встречаться ноль или более раз, как для `A*`.369370## 20.13.5. Константы ошибок Expat371372Следующие константы предоставляются в модуле [`xml.parsers.expat.errors`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat.errors). Эти константы полезны для интерпретации некоторых атрибутов объектов исключения `ExpatError`, возникающих при ошибке. Поскольку по причинам обратной совместимости значением констант является сообщение об ошибке *message*, а не числовой код ошибки *code*, это делается путём сравнения атрибута [`code`](https://python-all.ru/3.4/library/code.html#module-code) с `errors.codes[errors.XML_ERROR_CONSTANT_NAME]`.373374Модуль `errors` имеет следующие атрибуты:375376#### `xml.parsers.expat.errors.codes`377378Словарь, сопоставляющий числовые коды ошибок их строковым описаниям.379380Новое в версии 3.2.381382#### `xml.parsers.expat.errors.messages`383384Словарь, сопоставляющий строковые описания их кодам ошибок.385386Новое в версии 3.2.387388#### `xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY`389390#### `xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`391392Ссылка на сущность в значении атрибута указывала на внешнюю сущность вместо внутренней.393394#### `xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF`395396Ссылка на символ указала на символ, недопустимый в XML (например, символ `0` или ‘`&#0;`‘).397398#### `xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF`399400Ссылка на сущность указывала на сущность, объявленную с помощью нотации, поэтому её невозможно разобрать.401402#### `xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE`403404Атрибут был использован более одного раза в одном открывающем теге.405406#### `xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING`407408#### `xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN`409410Возникает, когда входной байт не удаётся правильно сопоставить с символом; например, нулевой байт (значение `0`) во входном потоке UTF-8.411412#### `xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT`413414После корневого элемента встретилось что-то, кроме пробельных символов.415416#### `xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI`417418Объявление XML обнаружено не в начале входных данных.419420#### `xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS`421422Документ не содержит ни одного элемента (XML требует, чтобы каждый документ содержал ровно один корневой элемент).423424#### `xml.parsers.expat.errors.XML_ERROR_NO_MEMORY`425426Expat не смог выделить память внутри себя.427428#### `xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF`429430Ссылка на параметрическую сущность обнаружена там, где она не допускается.431432#### `xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR`433434Во входных данных обнаружен неполный символ.435436#### `xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF`437438Ссылка на сущность содержала другую ссылку на ту же самую сущность; возможно, через другое имя, и возможно, косвенную.439440#### `xml.parsers.expat.errors.XML_ERROR_SYNTAX`441442Обнаружена некоторая неопределённая синтаксическая ошибка.443444#### `xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH`445446Закрывающий тег не соответствует самому внутреннему открытому открывающему тегу.447448#### `xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN`449450Какой-то токен (например, открывающий тег) не был закрыт до конца потока или до встречи следующего токена.451452#### `xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY`453454Ссылка на неопределённую сущность.455456#### `xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING`457458Кодировка документа не поддерживается Expat.459460#### `xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION`461462Раздел CDATA не был закрыт.463464#### `xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING`465466#### `xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE`467468Парсер определил, что документ не является “standalone”, хотя в XML-декларации он был объявлен таковым, и обработчик `NotStandaloneHandler` был установлен и вернул `0`.469470#### `xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE`471472#### `xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE`473474#### `xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD`475476Была запрошена операция, требующая встроенной поддержки DTD, но Expat был сконфигурирован без поддержки DTD. В стандартной сборке модуля [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) это сообщение никогда не должно возникать.477478#### `xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`479480Запрошено изменение поведения после начала синтаксического анализа, хотя его можно изменить только до начала анализа. На данный момент это исключение генерируется только функцией `UseForeignDTD()`.481482#### `xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX`483484При включённой обработке пространств имён обнаружен необъявленный префикс.485486#### `xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX`487488Документ пытается удалить объявление пространства имён, связанное с префиксом.489490#### `xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE`491492Параметрическая сущность содержит неполную разметку.493494#### `xml.parsers.expat.errors.XML_ERROR_XML_DECL`495496В документе отсутствует корневой элемент.497498#### `xml.parsers.expat.errors.XML_ERROR_TEXT_DECL`499500Ошибка при разборе текстовой декларации во внешней сущности.501502#### `xml.parsers.expat.errors.XML_ERROR_PUBLICID`503504В публичном идентификаторе обнаружены недопустимые символы.505506#### `xml.parsers.expat.errors.XML_ERROR_SUSPENDED`507508Запрошенная операция выполнена на приостановленном парсере, но не разрешена. Сюда входят попытки передать дополнительные данные или остановить парсер.509510#### `xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED`511512Попытка возобновить работу парсера, когда он не был приостановлен.513514#### `xml.parsers.expat.errors.XML_ERROR_ABORTED`515516Это не должно сообщаться приложениям Python.517518#### `xml.parsers.expat.errors.XML_ERROR_FINISHED`519520Попытка выполнить операцию над парсером, который уже закончил разбор входных данных, но такая операция запрещена. Сюда относятся попытки передать дополнительные данные или остановить парсер.521522#### `xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE`523524Сноски525526| [\[1\]](https://python-all.ru/3.4/library/pyexpat.html#id1) | Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.4/library/pyexpat.html) и [http://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/3.4/library/pyexpat.html). |527| --- | --- |528