pyexpat.md
1> **Источник:** https://python-all.ru/3.1/library/pyexpat.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.3. `xml.parsers.expat` – Быстрый разбор XML с помощью Expat89Модуль `xml.parsers.expat` представляет собой интерфейс Python к невалидирующему анализатору XML Expat. Модуль предоставляет единственный тип расширения, `xmlparser`, который представляет текущее состояние анализатора XML. После создания объекта `xmlparser` различные атрибуты этого объекта могут быть установлены в функции-обработчики. Когда XML-документ затем подается анализатору, функции-обработчики вызываются для символьных данных и разметки в XML-документе.1011Этот модуль использует модуль `pyexpat` для обеспечения доступа к парсеру Expat. Прямое использование модуля `pyexpat` устарело.1213Этот модуль предоставляет одно исключение и один объект типа:1415#### `exception xml.parsers.expat.ExpatError`1617Исключение, возникающее, когда Expat сообщает об ошибке. См. раздел1819[*Исключения ExpatError*](https://python-all.ru/3.1/library/pyexpat.html#expaterror-objects)2021для получения дополнительной информации об интерпретации ошибок Expat.2223#### `exception xml.parsers.expat.error`2425Псевдоним для2627[`ExpatError`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ExpatError)2829.3031#### `xml.parsers.expat.XMLParserType`3233Тип возвращаемых значений функции3435[`ParserCreate()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ParserCreate)3637.3839Модуль `xml.parsers.expat` содержит две функции:4041#### `xml.parsers.expat.ErrorString(errno)`4243Возвращает пояснительную строку для заданного номера ошибки4445*errno*4647.4849#### `xml.parsers.expat.ParserCreate([encoding[, namespace_separator]])`5051Создаёт и возвращает новый объект `xmlparser`. Параметр *encoding*, если указан, должен быть строкой, задающей кодировку, используемую XML-данными. Expat поддерживает не так много кодировок, как Python, и его набор кодировок не может быть расширен; он поддерживает UTF-8, UTF-16, ISO-8859-1 (Latin1) и ASCII. Если *encoding* [\[1\]](https://python-all.ru/3.1/library/pyexpat.html#id3) задан, он переопределяет неявную или явную кодировку документа.5253Expat может опционально выполнять обработку пространств имён XML, для чего необходимо указать значение для параметра *namespace\_separator*. Значение должно быть строкой из одного символа; если строка имеет недопустимую длину, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError) (`None` считается эквивалентом отсутствия значения). Когда обработка пространств имён включена, имена типов элементов и имена атрибутов, принадлежащие пространству имён, будут расширяться. Имя элемента, передаваемое обработчикам элементов `StartElementHandler` и `EndElementHandler`, будет конкатенацией URI пространства имён, символа разделителя пространства имён и локальной части имени. Если разделитель пространства имён – нулевой байт (`chr(0)`), то URI пространства имён и локальная часть объединяются без разделителя.5455Например, если *namespace\_separator* установлен в пробел (`' '`) и разбирается следующий документ:5657```python58<?xml version="1.0"?>59<root xmlns = "http://default-namespace.org/"60 xmlns:py = "http://www.python.org/ns/">61 <py:elem1 />62 <elem2 xmlns="" />63</root>64```6566`StartElementHandler` будет получать следующие строки для каждого элемента:6768```python69http://default-namespace.org/ root70http://www.python.org/ns/ elem171elem272```7374> **См. также**75>76> **[XML-парсер Expat](https://python-all.ru/3.1/library/pyexpat.html)**77>78> Домашняя страница проекта Expat.7980## 19.3.1. Объекты XMLParser8182Объекты `xmlparser` имеют следующие методы:8384#### `xmlparser.Parse(data[, isfinal])`8586Разбирает содержимое строки8788*data*8990, вызывая соответствующие функции-обработчики для обработки разобранных данных.9192*isfinal*9394должен быть истинным при последнем вызове этого метода.9596*data*9798может быть пустой строкой в любое время.99100#### `xmlparser.ParseFile(file)`101102Выполняет синтаксический анализ XML-данных, считывая их из объекта103104*file*105106. Объект107108*file*109110должен предоставлять только метод111112`read(nbytes)`113114, который возвращает пустую строку, когда данные закончились.115116#### `xmlparser.SetBase(base)`117118Устанавливает базовый URI, используемый для разрешения относительных URI в системных идентификаторах в объявлениях. Разрешение относительных идентификаторов оставлено на усмотрение приложения: это значение будет передаваться в качестве аргумента119120*base*121122функциям123124[`ExternalEntityRefHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler)125126,127128[`NotationDeclHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.NotationDeclHandler)129130и131132[`UnparsedEntityDeclHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler)133134.135136#### `xmlparser.GetBase()`137138Возвращает строку, содержащую базовый URI, установленный предыдущим вызовом139140[`SetBase()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase)141142, или143144`None`145146, если147148[`SetBase()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase)149150не вызывался.151152#### `xmlparser.GetInputContext()`153154Возвращает входные данные, которые породили текущее событие, в виде строки. Данные представлены в кодировке сущности, содержащей текст. Если метод вызван, когда обработчик события не активен, возвращается155156`None`157158.159160#### `xmlparser.ExternalEntityParserCreate(context, encodingencoding])`161162Create a “child” parser which can be used to parse an external parsed entity referred to by content parsed by the parent parser. The163164*context*165166parameter should be the string passed to the167168[`ExternalEntityRefHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler)169170handler function, described below. The child parser is created with the171172[`ordered_attributes`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes)173174and175176[`specified_attributes`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.specified_attributes)177178set to the values of this parser.179180#### `xmlparser.SetParamEntityParsing(flag)`181182Управляет синтаксическим анализом параметрических сущностей (включая внешнее подмножество DTD). Возможные значения183184*flag*185186:187188`XML_PARAM_ENTITY_PARSING_NEVER`189190,191192`XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE`193194и195196`XML_PARAM_ENTITY_PARSING_ALWAYS`197198. Возвращает true, если установка флага прошла успешно.199200#### `xmlparser.UseForeignDTD([flag])`201202Вызов этого с истинным значением для *flag* (по умолчанию) заставит Expat вызывать [`ExternalEntityRefHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) с [`None`](https://python-all.ru/3.1/library/constants.html#None) для всех аргументов, чтобы разрешить загрузку альтернативного DTD. Если документ не содержит объявления типа документа, [`ExternalEntityRefHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) всё равно будет вызван, но [`StartDoctypeDeclHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.StartDoctypeDeclHandler) и [`EndDoctypeDeclHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.EndDoctypeDeclHandler) вызываться не будут.203204Передача ложного значения для *флаг* отменяет предыдущий вызов, в котором передавалось истинное значение, но в остальном не имеет эффекта.205206Этот метод можно вызывать только до вызова методов [`Parse()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.Parse) или [`ParseFile()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile); вызов после любого из них приводит к возбуждению [`ExpatError`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ExpatError) с атрибутом `code`, установленным в `errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`.207208Объекты `xmlparser` имеют следующие атрибуты:209210#### `xmlparser.buffer_size`211212Размер буфера, используемого, когда213214[`buffer_text`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)215216имеет значение true. Новый размер буфера можно задать, присвоив этому атрибуту новое целочисленное значение. При изменении размера буфер будет сброшен.217218#### `xmlparser.buffer_text`219220Установка этого атрибута в true заставляет объект221222`xmlparser`223224буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избежать множественных вызовов колбэка225226[`CharacterDataHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.CharacterDataHandler)227228. Это может значительно повысить производительность, поскольку Expat обычно разбивает символьные данные на фрагменты на каждом конце строки. По умолчанию этот атрибут имеет значение false, и его можно изменить в любое время.229230#### `xmlparser.buffer_used`231232Если233234[`buffer_text`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)235236включён, то это количество байтов, хранящихся в буфере. Эти байты представляют текст в кодировке UTF-8. Этот атрибут не имеет осмысленной интерпретации, когда237238[`buffer_text`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)239240имеет значение false.241242#### `xmlparser.ordered_attributes`243244Установка этого атрибута в ненулевое целое число приводит к тому, что атрибуты возвращаются в виде списка, а не словаря. Атрибуты представляются в порядке их появления в тексте документа. Для каждого атрибута возвращаются два элемента списка: имя атрибута и значение атрибута. (Более старые версии этого модуля также использовали этот формат.) По умолчанию этот атрибут равен false; его можно изменить в любое время.245246#### `xmlparser.specified_attributes`247248Если установить в ненулевое целое число, парсер будет сообщать только те атрибуты, которые были указаны в экземпляре документа, а не те, которые получены из объявлений атрибутов. Приложения, устанавливающие этот флаг, должны быть особенно внимательны, чтобы использовать дополнительную информацию из объявлений по мере необходимости для соблюдения стандартов поведения XML-процессоров. По умолчанию этот атрибут равен false; его можно изменить в любое время.249250Следующие атрибуты содержат значения, относящиеся к самой последней ошибке, возникшей в объекте `xmlparser`, и будут иметь корректные значения только после того, как вызов `Parse()` или `ParseFile()` возбудит исключение [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ExpatError).251252#### `xmlparser.ErrorByteIndex`253254Индекс байта, на котором произошла ошибка.255256#### `xmlparser.ErrorCode`257258Числовой код, указывающий на проблему. Это значение можно передать функции259260[`ErrorString()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ErrorString)261262или сравнить с одной из констант, определённых в объекте263264`errors`265266.267268#### `xmlparser.ErrorColumnNumber`269270Номер столбца, на котором произошла ошибка.271272#### `xmlparser.ErrorLineNumber`273274Номер строки, в которой произошла ошибка.275276Следующие атрибуты содержат значения, относящиеся к текущей позиции разбора в объекте `xmlparser`. Во время колбэка, сообщающего о событии разбора, они указывают местоположение первого символа из последовательности символов, которая породила это событие. При вызове вне колбэка указанная позиция будет находиться сразу после последнего события разбора (независимо от того, был ли связанный с ним колбэк).277278#### `xmlparser.CurrentByteIndex`279280Текущий индекс байта во входных данных парсера.281282#### `xmlparser.CurrentColumnNumber`283284Текущий номер колонки во входных данных парсера.285286#### `xmlparser.CurrentLineNumber`287288Текущий номер строки во входных данных парсера.289290Вот список обработчиков, которые можно установить. Чтобы установить обработчик на объект `xmlparser` *o*, используйте `o.handlername = func`. *handlername* должно быть взято из следующего списка, а *func* должен быть вызываемым объектом, принимающим правильное количество аргументов. Если не указано иное, все аргументы являются строками.291292#### `xmlparser.XmlDeclHandler(version, encoding, standalone)`293294Вызывается при разборе XML-декларации. XML-декларация – это (необязательное) объявление используемой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone».295296*version*297298и299300*encoding*301302будут строками, а303304*standalone*305306будет307308`1`309310, если документ объявлен как standalone,311312`0`313314, если объявлено, что он не является standalone, или315316`-1`317318, если атрибут standalone был опущен. Доступно только в Expat версии 1.95.0 или новее.319320#### `xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)`321322Вызывается, когда Expat начинает разбор объявления типа документа (323324`<!DOCTYPE ...`325326). Параметр327328*doctypeName*329330предоставляется точно так, как он представлен. Параметры331332*systemId*333334и335336*publicId*337338задают системный и публичный идентификаторы, если они указаны, или339340`None`341342, если опущены. Параметр343344*has\_internal\_subset*345346будет иметь значение true, если документ содержит внутреннее подмножество объявления документа. Требуется Expat версии 1.2 или новее.347348#### `xmlparser.EndDoctypeDeclHandler()`349350Вызывается, когда Expat завершил разбор объявления типа документа. Требуется Expat версии 1.2 или новее.351352#### `xmlparser.ElementDeclHandler(name, model)`353354Вызывается один раз для каждого объявления типа элемента.355356*name*357358– это имя типа элемента, а359360*model*361362– представление модели содержимого.363364#### `xmlparser.AttlistDeclHandler(elname, attname, type, default, required)`365366Вызывается для каждого объявленного атрибута типа элемента. Если в объявлении списка атрибутов объявлено три атрибута, этот обработчик вызывается три раза, по одному на каждый атрибут.367368*elname*369370– это имя элемента, к которому относится объявление, а371372*attname*373374– имя объявленного атрибута. Тип атрибута – это строка, передаваемая как375376*type*377378; возможные значения:379380`'CDATA'`381382,383384`'ID'`385386,387388`'IDREF'`389390, ...391392*default*393394задаёт значение по умолчанию для атрибута, используемое, когда атрибут не указан в экземпляре документа, или395396`None`397398, если значения по умолчанию нет (значения399400`#IMPLIED`401402). Если атрибут требуется указывать в экземпляре документа,403404*required*405406будет иметь значение true. Требуется Expat версии 1.95.0 или новее.407408#### `xmlparser.StartElementHandler(name, attributes)`409410Вызывается в начале каждого элемента.411412*name*413414– строка, содержащая имя элемента, а415416*attributes*417418– словарь, сопоставляющий имена атрибутов с их значениями.419420#### `xmlparser.EndElementHandler(name)`421422Вызывается для конца каждого элемента.423424#### `xmlparser.ProcessingInstructionHandler(target, data)`425426Вызывается для каждой инструкции по обработке.427428#### `xmlparser.CharacterDataHandler(data)`429430Вызывается для символьных данных. Будет вызываться для обычных символьных данных, CDATA-разметки и игнорируемых пробелов. Приложения, которые должны различать эти случаи, могут использовать колбэки431432[`StartCdataSectionHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.StartCdataSectionHandler)433434,435436[`EndCdataSectionHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler)437438и439440[`ElementDeclHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.ElementDeclHandler)441442для сбора необходимой информации.443444#### `xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)`445446Вызывается для объявлений неразобранных (NDATA) сущностей. Доступно только для версии 1.2 библиотеки Expat; для более новых версий используйте447448[`EntityDeclHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.EntityDeclHandler)449450. (Соответствующая функция в библиотеке Expat признана устаревшей.)451452#### `xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)`453454Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей455456*value*457458будет строкой, содержащей объявленное содержимое сущности; для внешних сущностей этот параметр будет равен459460`None`461462. Параметр463464*notationName*465466будет равен467468`None`469470для разобранных сущностей и имени нотации для неразобранных сущностей. Параметр471472*is\_parameter\_entity*473474будет истинным, если сущность является параметрической, и ложным для общих сущностей (большинству приложений нужно работать только с общими сущностями). Это доступно только начиная с версии 1.95.0 библиотеки Expat.475476#### `xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)`477478Вызывается для объявлений нотаций. Параметры479480*notationName*481482,483484*base*485486,487488*systemId*489490и491492*publicId*493494, если заданы, являются строками. Если публичный идентификатор опущен,495496*publicId*497498будет равен499500`None`501502.503504#### `xmlparser.StartNamespaceDeclHandler(prefix, uri)`505506Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова507508[`StartElementHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.StartElementHandler)509510для элемента, в котором эти объявления расположены.511512#### `xmlparser.EndNamespaceDeclHandler(prefix)`513514Вызывается при достижении закрывающего тега элемента, содержавшего объявление пространства имён. Этот обработчик вызывается один раз для каждого объявления пространства имён в элементе в порядке, обратном тому, в котором вызывался515516[`StartNamespaceDeclHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.StartNamespaceDeclHandler)517518для указания начала области действия каждого объявления пространства имён. Вызовы этого обработчика производятся после соответствующего519520[`EndElementHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.EndElementHandler)521522для окончания элемента.523524#### `xmlparser.CommentHandler(data)`525526Вызывается для комментариев.527528*data*529530– это текст комментария, за исключением начального ‘531532`<!-`533534`-`535536‘ и конечного ‘537538`-`539540`->`541542‘.543544#### `xmlparser.StartCdataSectionHandler()`545546Вызывается в начале секции CDATA. Этот обработчик и547548[`EndCdataSectionHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler)549550необходимы для определения синтаксического начала и конца секций CDATA.551552#### `xmlparser.EndCdataSectionHandler()`553554Вызывается в конце секции CDATA.555556#### `xmlparser.DefaultHandler(data)`557558Вызывается для любых символов в XML-документе, для которых не был указан подходящий обработчик. Это символы, которые являются частью конструкции, о которой можно было бы сообщить, но для которой не предоставлен обработчик.559560#### `xmlparser.DefaultHandlerExpand(data)`561562Это то же самое, что и563564[`DefaultHandler()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler)565566, но не препятствует разворачиванию внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.567568#### `xmlparser.NotStandaloneHandler()`569570Вызывается, если XML-документ не был объявлен как автономный (standalone). Это происходит, когда присутствует внешнее подмножество или ссылка на параметрическую сущность, но в XML-декларации не указано standalone="571572`yes`573574". Если этот обработчик возвращает575576`0`577578, то анализатор вызовет ошибку579580`XML_ERROR_NOT_STANDALONE`581582. Если обработчик не установлен, анализатор не возбуждает исключение в этой ситуации.583584#### `xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)`585586Вызывается для ссылок на внешние сущности. Параметр *base* – это текущий базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase). Публичный и системный идентификаторы *systemId* и *publicId*, если заданы, являются строками; если публичный идентификатор не задан, *publicId* будет равен `None`. Значение *context* является непрозрачным и должно использоваться только так, как описано ниже.587588Для разбора внешних сущностей этот обработчик должен быть реализован. Он отвечает за создание под-анализатора с помощью `ExternalEntityParserCreate(context)`, его инициализацию соответствующими колбэками и разбор сущности. Этот обработчик должен возвращать целое число; если он возвращает `0`, анализатор возбудит ошибку `XML_ERROR_EXTERNAL_ENTITY_HANDLING`, в противном случае разбор продолжится.589590Если этот обработчик не предоставлен, внешние сущности сообщаются через колбэк [`DefaultHandler`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), если он установлен.591592## 19.3.2. Исключения ExpatError593594Исключения [`ExpatError`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ExpatError) имеют ряд интересных атрибутов:595596#### `ExpatError.code`597598Внутренний номер ошибки Expat для конкретной ошибки. Он соответствует одной из констант, определённых в объекте599600`errors`601602из этого модуля.603604#### `ExpatError.lineno`605606Номер строки, в которой обнаружена ошибка. Первая строка нумеруется как607608`1`609610.611612#### `ExpatError.offset`613614Смещение символов внутри строки, где произошла ошибка. Первый столбец нумеруется как615616`0`617618.619620## 19.3.3. Пример621622Следующая программа определяет три обработчика, которые просто выводят свои аргументы.623624```python625import xml.parsers.expat626627# 3 функции-обработчика628def start_element(name, attrs):629 print('Start element:', name, attrs)630def end_element(name):631 print('End element:', name)632def char_data(data):633 print('Character data:', repr(data))634635p = xml.parsers.expat.ParserCreate()636637p.StartElementHandler = start_element638p.EndElementHandler = end_element639p.CharacterDataHandler = char_data640641p.Parse("""<?xml version="1.0"?>642<parent id="top"><child1 name="paul">Text goes here</child1>643<child2 name="fred">More text</child2>644</parent>""", 1)645```646647Результат работы этой программы:648649```python650Start element: parent {'id': 'top'}651Start element: child1 {'name': 'paul'}652Character data: 'Text goes here'653End element: child1654Character data: '\n'655Start element: child2 {'name': 'fred'}656Character data: 'More text'657End element: child2658Character data: '\n'659End element: parent660```661662## 19.3.4. Описания моделей содержимого663664Модули содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы – это просто дополнительные описания модулей содержимого.665666Значения первых двух полей – это константы, определённые в объекте `model` модуля `xml.parsers.expat`. Эти константы можно разделить на две группы: группа типов моделей и группа квантификаторов.667668Константы группы типов моделей:669670#### `xml.parsers.expat.XML_CTYPE_ANY`671672Элемент, названный именем модели, был объявлен с моделью содержимого673674`ANY`675676.677678#### `xml.parsers.expat.XML_CTYPE_CHOICE`679680Именованный элемент допускает выбор из нескольких вариантов; это используется для моделей содержимого, таких как681682`(A | B | C)`683684.685686#### `xml.parsers.expat.XML_CTYPE_EMPTY`687688Элементы, объявленные как689690`EMPTY`691692, имеют этот тип модели.693694#### `xml.parsers.expat.XML_CTYPE_MIXED`695696#### `xml.parsers.expat.XML_CTYPE_NAME`697698#### `xml.parsers.expat.XML_CTYPE_SEQ`699700Модели, представляющие последовательность моделей, следующих одна за другой, обозначаются этим типом модели. Это используется для моделей, таких как701702`(A, B, C)`703704.705706Константы группы квантификаторов:707708#### `xml.parsers.expat.XML_CQUANT_NONE`709710Модификатор не указан, поэтому элемент может появиться ровно один раз, как для711712`A`713714.715716#### `xml.parsers.expat.XML_CQUANT_OPT`717718Модель является необязательной: она может появиться один раз или не появиться вовсе, как для719720`A?`721722.723724#### `xml.parsers.expat.XML_CQUANT_PLUS`725726Модель должна встречаться один или более раз (как727728`A+`729730).731732#### `xml.parsers.expat.XML_CQUANT_REP`733734Модель должна встречаться ноль или более раз, как для735736`A*`737738.739740## 19.3.5. Константы ошибок Expat741742Следующие константы предоставлены в объекте `errors` модуля `xml.parsers.expat`. Эти константы полезны для интерпретации некоторых атрибутов объектов исключения [`ExpatError`](https://python-all.ru/3.1/library/pyexpat.html#xml.parsers.expat.ExpatError), которые возбуждаются при возникновении ошибки.743744Объект `errors` имеет следующие атрибуты:745746#### `xml.parsers.expat.XML_ERROR_ASYNC_ENTITY`747748#### `xml.parsers.expat.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`749750Ссылка на сущность в значении атрибута указывала на внешнюю сущность вместо внутренней.751752#### `xml.parsers.expat.XML_ERROR_BAD_CHAR_REF`753754Ссылка на символ указала на символ, недопустимый в XML (например, символ755756`0`757758или ‘759760`�`761762‘).763764#### `xml.parsers.expat.XML_ERROR_BINARY_ENTITY_REF`765766Ссылка на сущность указывала на сущность, объявленную с помощью нотации, поэтому её невозможно разобрать.767768#### `xml.parsers.expat.XML_ERROR_DUPLICATE_ATTRIBUTE`769770Атрибут был использован более одного раза в одном открывающем теге.771772#### `xml.parsers.expat.XML_ERROR_INCORRECT_ENCODING`773774#### `xml.parsers.expat.XML_ERROR_INVALID_TOKEN`775776Возникает, когда входной байт не удаётся правильно сопоставить с символом; например, нулевой байт (значение777778`0`779780) во входном потоке UTF-8.781782#### `xml.parsers.expat.XML_ERROR_JUNK_AFTER_DOC_ELEMENT`783784После корневого элемента встретилось что-то, кроме пробельных символов.785786#### `xml.parsers.expat.XML_ERROR_MISPLACED_XML_PI`787788Объявление XML обнаружено не в начале входных данных.789790#### `xml.parsers.expat.XML_ERROR_NO_ELEMENTS`791792Документ не содержит ни одного элемента (XML требует, чтобы каждый документ содержал ровно один корневой элемент).793794#### `xml.parsers.expat.XML_ERROR_NO_MEMORY`795796Expat не смог выделить память внутри себя.797798#### `xml.parsers.expat.XML_ERROR_PARAM_ENTITY_REF`799800Ссылка на параметрическую сущность обнаружена там, где она не допускается.801802#### `xml.parsers.expat.XML_ERROR_PARTIAL_CHAR`803804Во входных данных обнаружен неполный символ.805806#### `xml.parsers.expat.XML_ERROR_RECURSIVE_ENTITY_REF`807808Ссылка на сущность содержала другую ссылку на ту же самую сущность; возможно, через другое имя, и возможно, косвенную.809810#### `xml.parsers.expat.XML_ERROR_SYNTAX`811812Обнаружена некоторая неопределённая синтаксическая ошибка.813814#### `xml.parsers.expat.XML_ERROR_TAG_MISMATCH`815816Закрывающий тег не соответствует самому внутреннему открытому открывающему тегу.817818#### `xml.parsers.expat.XML_ERROR_UNCLOSED_TOKEN`819820Какой-то токен (например, открывающий тег) не был закрыт до конца потока или до встречи следующего токена.821822#### `xml.parsers.expat.XML_ERROR_UNDEFINED_ENTITY`823824Ссылка на неопределённую сущность.825826#### `xml.parsers.expat.XML_ERROR_UNKNOWN_ENCODING`827828Кодировка документа не поддерживается Expat.829830#### `xml.parsers.expat.XML_ERROR_UNCLOSED_CDATA_SECTION`831832Раздел CDATA не был закрыт.833834#### `xml.parsers.expat.XML_ERROR_EXTERNAL_ENTITY_HANDLING`835836#### `xml.parsers.expat.XML_ERROR_NOT_STANDALONE`837838Парсер определил, что документ не является “standalone”, хотя в XML-декларации он был объявлен таковым, и обработчик839840`NotStandaloneHandler`841842был установлен и вернул843844`0`845846.847848#### `xml.parsers.expat.XML_ERROR_UNEXPECTED_STATE`849850#### `xml.parsers.expat.XML_ERROR_ENTITY_DECLARED_IN_PE`851852#### `xml.parsers.expat.XML_ERROR_FEATURE_REQUIRES_XML_DTD`853854Была запрошена операция, требующая встроенной поддержки DTD, но Expat был сконфигурирован без поддержки DTD. Это не должно сообщаться стандартной сборкой модуля855856`xml.parsers.expat`857858.859860#### `xml.parsers.expat.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`861862Запрошено изменение поведения после начала синтаксического анализа, хотя его можно изменить только до начала анализа. На данный момент это исключение генерируется только функцией863864`UseForeignDTD()`865866.867868#### `xml.parsers.expat.XML_ERROR_UNBOUND_PREFIX`869870При включённой обработке пространств имён обнаружен необъявленный префикс.871872#### `xml.parsers.expat.XML_ERROR_UNDECLARING_PREFIX`873874Документ пытается удалить объявление пространства имён, связанное с префиксом.875876#### `xml.parsers.expat.XML_ERROR_INCOMPLETE_PE`877878Параметрическая сущность содержит неполную разметку.879880#### `xml.parsers.expat.XML_ERROR_XML_DECL`881882В документе отсутствует корневой элемент.883884#### `xml.parsers.expat.XML_ERROR_TEXT_DECL`885886Ошибка при разборе текстовой декларации во внешней сущности.887888#### `xml.parsers.expat.XML_ERROR_PUBLICID`889890В публичном идентификаторе обнаружены недопустимые символы.891892#### `xml.parsers.expat.XML_ERROR_SUSPENDED`893894Запрошенная операция выполнена на приостановленном парсере, но не разрешена. Сюда входят попытки передать дополнительные данные или остановить парсер.895896#### `xml.parsers.expat.XML_ERROR_NOT_SUSPENDED`897898Попытка возобновить работу парсера, когда он не был приостановлен.899900#### `xml.parsers.expat.XML_ERROR_ABORTED`901902Это не должно сообщаться приложениям Python.903904#### `xml.parsers.expat.XML_ERROR_FINISHED`905906Попытка выполнить операцию над парсером, который уже закончил разбор входных данных, но такая операция запрещена. Сюда относятся попытки передать дополнительные данные или остановить парсер.907908#### `xml.parsers.expat.XML_ERROR_SUSPEND_PE`909910Сноски911912| \[1\] | Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.1/library/pyexpat.html) и [http://www.iana.org/assignments/character-sets](https://python-all.ru/3.1/library/pyexpat.html) . |913| --- | --- |914