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

pyexpat.md

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

1> **Источник:** https://python-all.ru/3.2/library/pyexpat.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.14. [`xml.parsers.expat`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat) – Быстрый разбор XML с помощью Expat89> **Предупреждение**10>11> Модуль `pyexpat` не является безопасным для злонамеренно сконструированных данных. Если необходимо обрабатывать ненадёжные или непроверенные данные, обратитесь к разделу [*уязвимости XML*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).1213Модуль [`xml.parsers.expat`](https://python-all.ru/3.2/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.2/library/pyexpat.html#expaterror-objects) для получения дополнительной информации об интерпретации ошибок Expat.2223#### `exception xml.parsers.expat.error`2425Псевдоним для [`ExpatError`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ExpatError).2627#### `xml.parsers.expat.XMLParserType`2829Тип возвращаемых значений функции [`ParserCreate()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ParserCreate).3031Модуль [`xml.parsers.expat`](https://python-all.ru/3.2/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.2/library/pyexpat.html#id3) задан, он переопределяет неявную или явную кодировку документа.4041Expat может опционально выполнять обработку пространств имён XML, для чего необходимо указать значение для параметра *namespace\_separator*. Значение должно быть строкой из одного символа; если строка имеет недопустимую длину, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.2/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> **См. также**63>64> **[XML-парсер Expat](https://python-all.ru/3.2/library/pyexpat.html)**65>66> Домашняя страница проекта Expat.6768## 19.14.1. Объекты XMLParser6970Объекты `xmlparser` имеют следующие методы:7172#### `xmlparser.Parse(data[, isfinal])`7374Разбирает содержимое строки *data*, вызывая соответствующие функции-обработчики для обработки разобранных данных. *isfinal* должен быть истинным при последнем вызове этого метода. *data* может быть пустой строкой в любое время.7576#### `xmlparser.ParseFile(file)`7778Выполняет синтаксический анализ XML-данных, считывая их из объекта *file*. Объект *file* должен предоставлять только метод `read(nbytes)`, который возвращает пустую строку, когда данные закончились.7980#### `xmlparser.SetBase(base)`8182Устанавливает базовый URI, используемый для разрешения относительных URI в системных идентификаторах в объявлениях. Разрешение относительных идентификаторов оставлено на усмотрение приложения: это значение будет передаваться в качестве аргумента *base* функциям [`ExternalEntityRefHandler()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler), [`NotationDeclHandler()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.NotationDeclHandler) и [`UnparsedEntityDeclHandler()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler).8384#### `xmlparser.GetBase()`8586Возвращает строку, содержащую базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase), или `None`, если [`SetBase()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase) не вызывался.8788#### `xmlparser.GetInputContext()`8990Возвращает входные данные, которые породили текущее событие, в виде строки. Данные представлены в кодировке сущности, содержащей текст. Если метод вызван, когда обработчик события не активен, возвращается `None`.9192#### `xmlparser.ExternalEntityParserCreate(context, encodingencoding])`9394Create 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.2/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.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes) and [`specified_attributes`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.specified_attributes) set to the values of this parser.9596#### `xmlparser.SetParamEntityParsing(flag)`9798Управляет синтаксическим анализом параметрических сущностей (включая внешнее подмножество DTD). Возможные значения *flag*: `XML_PARAM_ENTITY_PARSING_NEVER`, `XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE` и `XML_PARAM_ENTITY_PARSING_ALWAYS`. Возвращает true, если установка флага прошла успешно.99100#### `xmlparser.UseForeignDTD([flag])`101102Вызов этого с истинным значением для *flag* (по умолчанию) заставит Expat вызывать [`ExternalEntityRefHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) с [`None`](https://python-all.ru/3.2/library/constants.html#None) для всех аргументов, чтобы разрешить загрузку альтернативного DTD. Если документ не содержит объявления типа документа, [`ExternalEntityRefHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) всё равно будет вызван, но [`StartDoctypeDeclHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.StartDoctypeDeclHandler) и [`EndDoctypeDeclHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.EndDoctypeDeclHandler) вызываться не будут.103104Передача ложного значения для *флаг* отменяет предыдущий вызов, в котором передавалось истинное значение, но в остальном не имеет эффекта.105106Этот метод можно вызывать только до того, как будут вызваны методы [`Parse()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.Parse) или [`ParseFile()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile); вызов после вызова любого из них приводит к возникновению [`ExpatError`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ExpatError) с атрибутом [`code`](https://python-all.ru/3.2/library/code.html#module-code), установленным в `errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]`.107108Объекты `xmlparser` имеют следующие атрибуты:109110#### `xmlparser.buffer_size`111112Размер буфера, используемого, когда [`buffer_text`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) имеет значение true. Новый размер буфера можно задать, присвоив этому атрибуту новое целочисленное значение. При изменении размера буфер будет сброшен.113114#### `xmlparser.buffer_text`115116Установка этого атрибута в true заставляет объект `xmlparser` буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избежать множественных вызовов колбэка [`CharacterDataHandler()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.CharacterDataHandler). Это может значительно повысить производительность, поскольку Expat обычно разбивает символьные данные на фрагменты на каждом конце строки. По умолчанию этот атрибут имеет значение false, и его можно изменить в любое время.117118#### `xmlparser.buffer_used`119120Если [`buffer_text`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) включён, то это количество байтов, хранящихся в буфере. Эти байты представляют текст в кодировке UTF-8. Этот атрибут не имеет осмысленной интерпретации, когда [`buffer_text`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text) имеет значение false.121122#### `xmlparser.ordered_attributes`123124Установка этого атрибута в ненулевое целое число приводит к тому, что атрибуты возвращаются в виде списка, а не словаря. Атрибуты представляются в порядке их появления в тексте документа. Для каждого атрибута возвращаются два элемента списка: имя атрибута и значение атрибута. (Более старые версии этого модуля также использовали этот формат.) По умолчанию этот атрибут равен false; его можно изменить в любое время.125126#### `xmlparser.specified_attributes`127128Если установить в ненулевое целое число, парсер будет сообщать только те атрибуты, которые были указаны в экземпляре документа, а не те, которые получены из объявлений атрибутов. Приложения, устанавливающие этот флаг, должны быть особенно внимательны, чтобы использовать дополнительную информацию из объявлений по мере необходимости для соблюдения стандартов поведения XML-процессоров. По умолчанию этот атрибут равен false; его можно изменить в любое время.129130Следующие атрибуты содержат значения, относящиеся к самой последней ошибке, возникшей в объекте `xmlparser`, и будут иметь корректные значения только после того, как вызов `Parse()` или `ParseFile()` возбудит исключение [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ExpatError).131132#### `xmlparser.ErrorByteIndex`133134Индекс байта, на котором произошла ошибка.135136#### `xmlparser.ErrorCode`137138Числовой код, указывающий на проблему. Это значение можно передать функции [`ErrorString()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ErrorString) или сравнить с одной из констант, определённых в объекте `errors`.139140#### `xmlparser.ErrorColumnNumber`141142Номер столбца, на котором произошла ошибка.143144#### `xmlparser.ErrorLineNumber`145146Номер строки, в которой произошла ошибка.147148Следующие атрибуты содержат значения, относящиеся к текущей позиции разбора в объекте `xmlparser`. Во время колбэка, сообщающего о событии разбора, они указывают местоположение первого символа из последовательности символов, которая породила это событие. При вызове вне колбэка указанная позиция будет находиться сразу после последнего события разбора (независимо от того, был ли связанный с ним колбэк).149150#### `xmlparser.CurrentByteIndex`151152Текущий индекс байта во входных данных парсера.153154#### `xmlparser.CurrentColumnNumber`155156Текущий номер колонки во входных данных парсера.157158#### `xmlparser.CurrentLineNumber`159160Текущий номер строки во входных данных парсера.161162Вот список обработчиков, которые можно установить. Чтобы установить обработчик на объект `xmlparser` *o*, используйте `o.handlername = func`. *handlername* должно быть взято из следующего списка, а *func* должен быть вызываемым объектом, принимающим правильное количество аргументов. Если не указано иное, все аргументы являются строками.163164#### `xmlparser.XmlDeclHandler(version, encoding, standalone)`165166Вызывается при разборе XML-декларации. XML-декларация – это (необязательное) объявление используемой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone». *version* и *encoding* будут строками, а *standalone* будет `1`, если документ объявлен как standalone, `0`, если объявлено, что он не является standalone, или `-1`, если атрибут standalone был опущен. Доступно только в Expat версии 1.95.0 или новее.167168#### `xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)`169170Вызывается, когда Expat начинает разбор объявления типа документа (`<!DOCTYPE ...`). Параметр *doctypeName* предоставляется точно так, как он представлен. Параметры *systemId* и *publicId* задают системный и публичный идентификаторы, если они указаны, или `None`, если опущены. Параметр *has\_internal\_subset* будет иметь значение true, если документ содержит внутреннее подмножество объявления документа. Требуется Expat версии 1.2 или новее.171172#### `xmlparser.EndDoctypeDeclHandler()`173174Вызывается, когда Expat завершил разбор объявления типа документа. Требуется Expat версии 1.2 или новее.175176#### `xmlparser.ElementDeclHandler(name, model)`177178Вызывается один раз для каждого объявления типа элемента. *name* – это имя типа элемента, а *model* – представление модели содержимого.179180#### `xmlparser.AttlistDeclHandler(elname, attname, type, default, required)`181182Вызывается для каждого объявленного атрибута типа элемента. Если в объявлении списка атрибутов объявлено три атрибута, этот обработчик вызывается три раза, по одному на каждый атрибут. *elname* – это имя элемента, к которому относится объявление, а *attname* – имя объявленного атрибута. Тип атрибута – это строка, передаваемая как *type*; возможные значения: `'CDATA'`, `'ID'`, `'IDREF'`, ... *default* задаёт значение по умолчанию для атрибута, используемое, когда атрибут не указан в экземпляре документа, или `None`, если значения по умолчанию нет (значения `#IMPLIED`). Если атрибут требуется указывать в экземпляре документа, *required* будет иметь значение true. Требуется Expat версии 1.95.0 или новее.183184#### `xmlparser.StartElementHandler(name, attributes)`185186Вызывается в начале каждого элемента. *name* – строка, содержащая имя элемента, а *attributes* – словарь, сопоставляющий имена атрибутов с их значениями.187188#### `xmlparser.EndElementHandler(name)`189190Вызывается для конца каждого элемента.191192#### `xmlparser.ProcessingInstructionHandler(target, data)`193194Вызывается для каждой инструкции по обработке.195196#### `xmlparser.CharacterDataHandler(data)`197198Вызывается для символьных данных. Будет вызываться для обычных символьных данных, CDATA-разметки и игнорируемых пробелов. Приложения, которые должны различать эти случаи, могут использовать колбэки [`StartCdataSectionHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.StartCdataSectionHandler), [`EndCdataSectionHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) и [`ElementDeclHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.ElementDeclHandler) для сбора необходимой информации.199200#### `xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)`201202Вызывается для объявлений неразобранных (NDATA) сущностей. Доступно только для версии 1.2 библиотеки Expat; для более новых версий используйте [`EntityDeclHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.EntityDeclHandler). (Соответствующая функция в библиотеке Expat признана устаревшей.)203204#### `xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)`205206Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей *value* будет строкой, содержащей объявленное содержимое сущности; для внешних сущностей этот параметр будет равен `None`. Параметр *notationName* будет равен `None` для разобранных сущностей и имени нотации для неразобранных сущностей. Параметр *is\_parameter\_entity* будет истинным, если сущность является параметрической, и ложным для общих сущностей (большинству приложений нужно работать только с общими сущностями). Это доступно только начиная с версии 1.95.0 библиотеки Expat.207208#### `xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)`209210Вызывается для объявлений нотаций. Параметры *notationName*, *base*, *systemId* и *publicId*, если заданы, являются строками. Если публичный идентификатор опущен, *publicId* будет равен `None`.211212#### `xmlparser.StartNamespaceDeclHandler(prefix, uri)`213214Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова [`StartElementHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.StartElementHandler) для элемента, в котором эти объявления расположены.215216#### `xmlparser.EndNamespaceDeclHandler(prefix)`217218Вызывается при достижении закрывающего тега элемента, содержавшего объявление пространства имён. Этот обработчик вызывается один раз для каждого объявления пространства имён в элементе в порядке, обратном тому, в котором вызывался [`StartNamespaceDeclHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.StartNamespaceDeclHandler) для указания начала области действия каждого объявления пространства имён. Вызовы этого обработчика производятся после соответствующего [`EndElementHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.EndElementHandler) для окончания элемента.219220#### `xmlparser.CommentHandler(data)`221222Вызывается для комментариев. *data* – текст комментария, без начальных `'<!-``-'` и конечных `'-``->'`.223224#### `xmlparser.StartCdataSectionHandler()`225226Вызывается в начале секции CDATA. Этот обработчик и [`EndCdataSectionHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler) необходимы для определения синтаксического начала и конца секций CDATA.227228#### `xmlparser.EndCdataSectionHandler()`229230Вызывается в конце секции CDATA.231232#### `xmlparser.DefaultHandler(data)`233234Вызывается для любых символов в XML-документе, для которых не был указан подходящий обработчик. Это символы, которые являются частью конструкции, о которой можно было бы сообщить, но для которой не предоставлен обработчик.235236#### `xmlparser.DefaultHandlerExpand(data)`237238Это то же самое, что и [`DefaultHandler()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), но не препятствует разворачиванию внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.239240#### `xmlparser.NotStandaloneHandler()`241242Вызывается, если XML-документ не был объявлен как автономный (standalone). Это происходит, когда присутствует внешнее подмножество или ссылка на параметрическую сущность, но в XML-декларации не указано standalone="`yes`". Если этот обработчик возвращает `0`, то анализатор вызовет ошибку `XML_ERROR_NOT_STANDALONE`. Если обработчик не установлен, анализатор не возбуждает исключение в этой ситуации.243244#### `xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)`245246Вызывается для ссылок на внешние сущности. Параметр *base* – это текущий базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase). Публичный и системный идентификаторы *systemId* и *publicId*, если заданы, являются строками; если публичный идентификатор не задан, *publicId* будет равен `None`. Значение *context* является непрозрачным и должно использоваться только так, как описано ниже.247248Для разбора внешних сущностей этот обработчик должен быть реализован. Он отвечает за создание под-анализатора с помощью `ExternalEntityParserCreate(context)`, его инициализацию соответствующими колбэками и разбор сущности. Этот обработчик должен возвращать целое число; если он возвращает `0`, анализатор возбудит ошибку `XML_ERROR_EXTERNAL_ENTITY_HANDLING`, в противном случае разбор продолжится.249250Если этот обработчик не предоставлен, внешние сущности сообщаются через колбэк [`DefaultHandler`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), если он установлен.251252## 19.14.2. Исключения ExpatError253254Исключения [`ExpatError`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.ExpatError) имеют ряд интересных атрибутов:255256#### `ExpatError.code`257258Внутренний номер ошибки Expat для конкретной ошибки. Словарь [`errors.messages`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.errors.messages) сопоставляет эти номера с сообщениями об ошибках Expat. Например:259260```python261from xml.parsers.expat import ParserCreate, ExpatError, errors262263p = ParserCreate()264try:265    p.Parse(some_xml_document)266except ExpatError as err:267    print("Error:", errors.messages[err.code])268```269270Модуль `errors` также предоставляет константы сообщений об ошибках и словарь [`codes`](https://python-all.ru/3.2/library/pyexpat.html#xml.parsers.expat.errors.codes), сопоставляющий эти сообщения с кодами ошибок, см. ниже.271272#### `ExpatError.lineno`273274Номер строки, в которой обнаружена ошибка. Первая строка нумеруется как `1`.275276#### `ExpatError.offset`277278Смещение символов внутри строки, где произошла ошибка. Первый столбец нумеруется как `0`.279280## 19.14.3. Пример281282Следующая программа определяет три обработчика, которые просто выводят свои аргументы.283284```python285import xml.parsers.expat286287# 3 функции-обработчика288def start_element(name, attrs):289    print('Start element:', name, attrs)290def end_element(name):291    print('End element:', name)292def char_data(data):293    print('Character data:', repr(data))294295p = xml.parsers.expat.ParserCreate()296297p.StartElementHandler = start_element298p.EndElementHandler = end_element299p.CharacterDataHandler = char_data300301p.Parse("""<?xml version="1.0"?>302<parent id="top"><child1 name="paul">Text goes here</child1>303<child2 name="fred">More text</child2>304</parent>""", 1)305```306307Результат работы этой программы:308309```python310Start element: parent {'id': 'top'}311Start element: child1 {'name': 'paul'}312Character data: 'Text goes here'313End element: child1314Character data: '\n'315Start element: child2 {'name': 'fred'}316Character data: 'More text'317End element: child2318Character data: '\n'319End element: parent320```321322## 19.14.4. Описания моделей содержимого323324Модули содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы – это просто дополнительные описания модулей содержимого.325326Значения первых двух полей – это константы, определённые в модуле [`xml.parsers.expat.model`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat.model). Эти константы можно разделить на две группы: группа типов модели и группа квантификаторов.327328Константы группы типов моделей:329330#### `xml.parsers.expat.model.XML_CTYPE_ANY`331332Элемент, названный именем модели, был объявлен с моделью содержимого `ANY`.333334#### `xml.parsers.expat.model.XML_CTYPE_CHOICE`335336Именованный элемент допускает выбор из нескольких вариантов; это используется для моделей содержимого, таких как `(A | B | C)`.337338#### `xml.parsers.expat.model.XML_CTYPE_EMPTY`339340Элементы, объявленные как `EMPTY`, имеют этот тип модели.341342#### `xml.parsers.expat.model.XML_CTYPE_MIXED`343344#### `xml.parsers.expat.model.XML_CTYPE_NAME`345346#### `xml.parsers.expat.model.XML_CTYPE_SEQ`347348Модели, представляющие последовательность моделей, следующих одна за другой, обозначаются этим типом модели. Это используется для моделей, таких как `(A, B, C)`.349350Константы группы квантификаторов:351352#### `xml.parsers.expat.model.XML_CQUANT_NONE`353354Модификатор не указан, поэтому элемент может появиться ровно один раз, как для `A`.355356#### `xml.parsers.expat.model.XML_CQUANT_OPT`357358Модель является необязательной: она может появиться один раз или не появиться вовсе, как для `A?`.359360#### `xml.parsers.expat.model.XML_CQUANT_PLUS`361362Модель должна встречаться один или более раз (как `A+`).363364#### `xml.parsers.expat.model.XML_CQUANT_REP`365366Модель должна встречаться ноль или более раз, как для `A*`.367368## 19.14.5. Константы ошибок Expat369370Следующие константы предоставляются в модуле [`xml.parsers.expat.errors`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat.errors). Эти константы полезны для интерпретации некоторых атрибутов объектов исключения `ExpatError`, возникающих при ошибке. Поскольку по причинам обратной совместимости значением констант является сообщение об ошибке *message*, а не числовой код ошибки *code*, это делается путём сравнения атрибута [`code`](https://python-all.ru/3.2/library/code.html#module-code) с `errors.codes[errors.XML_ERROR_CONSTANT_NAME]`.371372Модуль `errors` имеет следующие атрибуты:373374#### `xml.parsers.expat.errors.codes`375376Словарь, сопоставляющий числовые коды ошибок их строковым описаниям.377378Новое в версии 3.2.379380#### `xml.parsers.expat.errors.messages`381382Словарь, сопоставляющий строковые описания их кодам ошибок.383384Новое в версии 3.2.385386#### `xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY`387388#### `xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`389390Ссылка на сущность в значении атрибута указывала на внешнюю сущность вместо внутренней.391392#### `xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF`393394Ссылка на символ указала на символ, недопустимый в XML (например, символ `0` или ‘`&#0;`‘).395396#### `xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF`397398Ссылка на сущность указывала на сущность, объявленную с помощью нотации, поэтому её невозможно разобрать.399400#### `xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE`401402Атрибут был использован более одного раза в одном открывающем теге.403404#### `xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING`405406#### `xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN`407408Возникает, когда входной байт не удаётся правильно сопоставить с символом; например, нулевой байт (значение `0`) во входном потоке UTF-8.409410#### `xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT`411412После корневого элемента встретилось что-то, кроме пробельных символов.413414#### `xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI`415416Объявление XML обнаружено не в начале входных данных.417418#### `xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS`419420Документ не содержит ни одного элемента (XML требует, чтобы каждый документ содержал ровно один корневой элемент).421422#### `xml.parsers.expat.errors.XML_ERROR_NO_MEMORY`423424Expat не смог выделить память внутри себя.425426#### `xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF`427428Ссылка на параметрическую сущность обнаружена там, где она не допускается.429430#### `xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR`431432Во входных данных обнаружен неполный символ.433434#### `xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF`435436Ссылка на сущность содержала другую ссылку на ту же самую сущность; возможно, через другое имя, и возможно, косвенную.437438#### `xml.parsers.expat.errors.XML_ERROR_SYNTAX`439440Обнаружена некоторая неопределённая синтаксическая ошибка.441442#### `xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH`443444Закрывающий тег не соответствует самому внутреннему открытому открывающему тегу.445446#### `xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN`447448Какой-то токен (например, открывающий тег) не был закрыт до конца потока или до встречи следующего токена.449450#### `xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY`451452Ссылка на неопределённую сущность.453454#### `xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING`455456Кодировка документа не поддерживается Expat.457458#### `xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION`459460Раздел CDATA не был закрыт.461462#### `xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING`463464#### `xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE`465466Парсер определил, что документ не является “standalone”, хотя в XML-декларации он был объявлен таковым, и обработчик `NotStandaloneHandler` был установлен и вернул `0`.467468#### `xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE`469470#### `xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE`471472#### `xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD`473474Была запрошена операция, требующая встроенной поддержки DTD, но Expat был сконфигурирован без поддержки DTD. В стандартной сборке модуля [`xml.parsers.expat`](https://python-all.ru/3.2/library/pyexpat.html#module-xml.parsers.expat) это сообщение никогда не должно возникать.475476#### `xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`477478Запрошено изменение поведения после начала синтаксического анализа, хотя его можно изменить только до начала анализа. На данный момент это исключение генерируется только функцией `UseForeignDTD()`.479480#### `xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX`481482При включённой обработке пространств имён обнаружен необъявленный префикс.483484#### `xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX`485486Документ пытается удалить объявление пространства имён, связанное с префиксом.487488#### `xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE`489490Параметрическая сущность содержит неполную разметку.491492#### `xml.parsers.expat.errors.XML_ERROR_XML_DECL`493494В документе отсутствует корневой элемент.495496#### `xml.parsers.expat.errors.XML_ERROR_TEXT_DECL`497498Ошибка при разборе текстовой декларации во внешней сущности.499500#### `xml.parsers.expat.errors.XML_ERROR_PUBLICID`501502В публичном идентификаторе обнаружены недопустимые символы.503504#### `xml.parsers.expat.errors.XML_ERROR_SUSPENDED`505506Запрошенная операция выполнена на приостановленном парсере, но не разрешена. Сюда входят попытки передать дополнительные данные или остановить парсер.507508#### `xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED`509510Попытка возобновить работу парсера, когда он не был приостановлен.511512#### `xml.parsers.expat.errors.XML_ERROR_ABORTED`513514Это не должно сообщаться приложениям Python.515516#### `xml.parsers.expat.errors.XML_ERROR_FINISHED`517518Попытка выполнить операцию над парсером, который уже закончил разбор входных данных, но такая операция запрещена. Сюда относятся попытки передать дополнительные данные или остановить парсер.519520#### `xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE`521522Сноски523524| \[1\] | Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.2/library/pyexpat.html) и [http://www.iana.org/assignments/character-sets](https://python-all.ru/3.2/library/pyexpat.html) . |525| --- | --- |526