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

pyexpat.md

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

1> **Источник:** https://python-all.ru/3.0/library/pyexpat.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `xml.parsers.expat` – Быстрый разбор XML с помощью Expat89Модуль `xml.parsers.expat` представляет собой интерфейс Python к невалидирующему анализатору XML Expat. Модуль предоставляет единственный тип расширения, `xmlparser`, который представляет текущее состояние анализатора XML. После создания объекта `xmlparser` различные атрибуты этого объекта могут быть установлены в функции-обработчики. Когда XML-документ затем подается анализатору, функции-обработчики вызываются для символьных данных и разметки в XML-документе.1011Этот модуль использует модуль `pyexpat` для обеспечения доступа к парсеру Expat. Прямое использование модуля `pyexpat` устарело.1213Этот модуль предоставляет одно исключение и один объект типа:1415#### `[xml.parsers.expat.ExpatError]exception xml.parsers.expat.ExpatError`1617Исключение, возникающее, когда Expat сообщает об ошибке. См. раздел1819[*Исключения ExpatError*](https://python-all.ru/3.0/library/pyexpat.html#expaterror-objects)2021для получения дополнительной информации об интерпретации ошибок Expat.2223#### `[xml.parsers.expat.error]exception xml.parsers.expat.error`2425Псевдоним для2627[`ExpatError`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ExpatError)2829.3031#### `[xml.parsers.expat.XMLParserType]xml.parsers.expat.XMLParserType`3233Тип возвращаемых значений функции3435[`ParserCreate()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ParserCreate)3637.3839Модуль `xml.parsers.expat` содержит две функции:4041#### `[xml.parsers.expat.ErrorString]xml.parsers.expat.ErrorString(errno)`4243Возвращает пояснительную строку для заданного номера ошибки4445*errno*4647.4849#### `[xml.parsers.expat.ParserCreate]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.0/library/pyexpat.html#id3) задан, он переопределяет неявную или явную кодировку документа.5253Expat может опционально выполнять обработку пространств имён XML, для чего необходимо указать значение для параметра *namespace\_separator*. Значение должно быть строкой из одного символа; если строка имеет недопустимую длину, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.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.0/library/pyexpat.html)**77>78> Домашняя страница проекта Expat.7980## Объекты XMLParser8182Объекты `xmlparser` имеют следующие методы:8384#### `[xml.parsers.expat.xmlparser.Parse]xmlparser.Parse(data[, isfinal])`8586Разбирает содержимое строки8788*data*8990, вызывая соответствующие функции-обработчики для обработки разобранных данных.9192*isfinal*9394должен быть истинным при последнем вызове этого метода.9596*data*9798может быть пустой строкой в любое время.99100#### `[xml.parsers.expat.xmlparser.ParseFile]xmlparser.ParseFile(file)`101102Выполняет синтаксический анализ XML-данных, считывая их из объекта103104*file*105106. Объект107108*file*109110должен предоставлять только метод111112`read(nbytes)`113114, который возвращает пустую строку, когда данные закончились.115116#### `[xml.parsers.expat.xmlparser.SetBase]xmlparser.SetBase(base)`117118Устанавливает базовый URI, используемый для разрешения относительных URI в системных идентификаторах в объявлениях. Разрешение относительных идентификаторов оставлено на усмотрение приложения: это значение будет передаваться в качестве аргумента119120*base*121122функциям123124[`ExternalEntityRefHandler()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler)125126,127128[`NotationDeclHandler()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.NotationDeclHandler)129130и131132[`UnparsedEntityDeclHandler()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler)133134.135136#### `[xml.parsers.expat.xmlparser.GetBase]xmlparser.GetBase()`137138Возвращает строку, содержащую базовый URI, установленный предыдущим вызовом139140[`SetBase()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase)141142, или143144`None`145146, если147148[`SetBase()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase)149150не вызывался.151152#### `[xml.parsers.expat.xmlparser.GetInputContext]xmlparser.GetInputContext()`153154Возвращает входные данные, которые породили текущее событие, в виде строки. Данные представлены в кодировке сущности, содержащей текст. Если метод вызван, когда обработчик события не активен, возвращается155156`None`157158.159160#### `[xml.parsers.expat.xmlparser.ExternalEntityParserCreate]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.0/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.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ordered_attributes)173174and175176[`specified_attributes`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.specified_attributes)177178set to the values of this parser.179180#### `[xml.parsers.expat.xmlparser.UseForeignDTD]xmlparser.UseForeignDTD([flag])`181182Вызов этого с истинным значением для *flag* (по умолчанию) заставит Expat вызывать [`ExternalEntityRefHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) с [`None`](https://python-all.ru/3.0/library/constants.html#None) для всех аргументов, чтобы разрешить загрузку альтернативного DTD. Если документ не содержит объявления типа документа, [`ExternalEntityRefHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ExternalEntityRefHandler) всё равно будет вызван, но [`StartDoctypeDeclHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.StartDoctypeDeclHandler) и [`EndDoctypeDeclHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.EndDoctypeDeclHandler) вызываться не будут.183184Передача ложного значения для *флаг* отменяет предыдущий вызов, в котором передавалось истинное значение, но в остальном не имеет эффекта.185186Этот метод можно вызывать только до вызова методов [`Parse()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.Parse) или [`ParseFile()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile); вызов после любого из них приводит к возбуждению [`ExpatError`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ExpatError) с атрибутом `code`, установленным в `errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`.187188Объекты `xmlparser` имеют следующие атрибуты:189190#### `[xml.parsers.expat.xmlparser.buffer_size]xmlparser.buffer_size`191192Размер буфера, используемого, когда193194[`buffer_text`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)195196имеет значение true. Новый размер буфера можно задать, присвоив этому атрибуту новое целочисленное значение. При изменении размера буфер будет сброшен.197198#### `[xml.parsers.expat.xmlparser.buffer_text]xmlparser.buffer_text`199200Установка этого атрибута в true заставляет объект201202`xmlparser`203204буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избежать множественных вызовов колбэка205206[`CharacterDataHandler()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.CharacterDataHandler)207208. Это может значительно повысить производительность, поскольку Expat обычно разбивает символьные данные на фрагменты на каждом конце строки. По умолчанию этот атрибут имеет значение false, и его можно изменить в любое время.209210#### `[xml.parsers.expat.xmlparser.buffer_used]xmlparser.buffer_used`211212Если213214[`buffer_text`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)215216включён, то это количество байтов, хранящихся в буфере. Эти байты представляют текст в кодировке UTF-8. Этот атрибут не имеет осмысленной интерпретации, когда217218[`buffer_text`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.buffer_text)219220имеет значение false.221222#### `[xml.parsers.expat.xmlparser.ordered_attributes]xmlparser.ordered_attributes`223224Установка этого атрибута в ненулевое целое число приводит к тому, что атрибуты возвращаются в виде списка, а не словаря. Атрибуты представляются в порядке их появления в тексте документа. Для каждого атрибута возвращаются два элемента списка: имя атрибута и значение атрибута. (Более старые версии этого модуля также использовали этот формат.) По умолчанию этот атрибут равен false; его можно изменить в любое время.225226#### `[xml.parsers.expat.xmlparser.specified_attributes]xmlparser.specified_attributes`227228Если установить в ненулевое целое число, парсер будет сообщать только те атрибуты, которые были указаны в экземпляре документа, а не те, которые получены из объявлений атрибутов. Приложения, устанавливающие этот флаг, должны быть особенно внимательны, чтобы использовать дополнительную информацию из объявлений по мере необходимости для соблюдения стандартов поведения XML-процессоров. По умолчанию этот атрибут равен false; его можно изменить в любое время.229230Следующие атрибуты содержат значения, относящиеся к самой последней ошибке, возникшей в объекте `xmlparser`, и будут иметь корректные значения только после того, как вызов `Parse()` или `ParseFile()` возбудит исключение [`xml.parsers.expat.ExpatError`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ExpatError).231232#### `[xml.parsers.expat.xmlparser.ErrorByteIndex]xmlparser.ErrorByteIndex`233234Индекс байта, на котором произошла ошибка.235236#### `[xml.parsers.expat.xmlparser.ErrorCode]xmlparser.ErrorCode`237238Числовой код, указывающий на проблему. Это значение можно передать функции239240[`ErrorString()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ErrorString)241242или сравнить с одной из констант, определённых в объекте243244`errors`245246.247248#### `[xml.parsers.expat.xmlparser.ErrorColumnNumber]xmlparser.ErrorColumnNumber`249250Номер столбца, на котором произошла ошибка.251252#### `[xml.parsers.expat.xmlparser.ErrorLineNumber]xmlparser.ErrorLineNumber`253254Номер строки, в которой произошла ошибка.255256Следующие атрибуты содержат значения, относящиеся к текущей позиции разбора в объекте `xmlparser`. Во время колбэка, сообщающего о событии разбора, они указывают местоположение первого символа из последовательности символов, которая породила это событие. При вызове вне колбэка указанная позиция будет находиться сразу после последнего события разбора (независимо от того, был ли связанный с ним колбэк).257258#### `[xml.parsers.expat.xmlparser.CurrentByteIndex]xmlparser.CurrentByteIndex`259260Текущий индекс байта во входных данных парсера.261262#### `[xml.parsers.expat.xmlparser.CurrentColumnNumber]xmlparser.CurrentColumnNumber`263264Текущий номер колонки во входных данных парсера.265266#### `[xml.parsers.expat.xmlparser.CurrentLineNumber]xmlparser.CurrentLineNumber`267268Текущий номер строки во входных данных парсера.269270Вот список обработчиков, которые можно установить. Чтобы установить обработчик на объект `xmlparser` *o*, используйте `o.handlername = func`. *handlername* должно быть взято из следующего списка, а *func* должен быть вызываемым объектом, принимающим правильное количество аргументов. Если не указано иное, все аргументы являются строками.271272#### `[xml.parsers.expat.xmlparser.XmlDeclHandler]xmlparser.XmlDeclHandler(version, encoding, standalone)`273274Вызывается при разборе XML-декларации. XML-декларация – это (необязательное) объявление используемой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone».275276*version*277278и279280*encoding*281282будут строками, а283284*standalone*285286будет287288`1`289290, если документ объявлен как standalone,291292`0`293294, если объявлено, что он не является standalone, или295296`-1`297298, если атрибут standalone был опущен. Доступно только в Expat версии 1.95.0 или новее.299300#### `[xml.parsers.expat.xmlparser.StartDoctypeDeclHandler]xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)`301302Вызывается, когда Expat начинает разбор объявления типа документа (303304`<!DOCTYPE ...`305306). Параметр307308*doctypeName*309310предоставляется точно так, как он представлен. Параметры311312*systemId*313314и315316*publicId*317318задают системный и публичный идентификаторы, если они указаны, или319320`None`321322, если опущены. Параметр323324*has\_internal\_subset*325326будет иметь значение true, если документ содержит внутреннее подмножество объявления документа. Требуется Expat версии 1.2 или новее.327328#### `[xml.parsers.expat.xmlparser.EndDoctypeDeclHandler]xmlparser.EndDoctypeDeclHandler()`329330Вызывается, когда Expat завершил разбор объявления типа документа. Требуется Expat версии 1.2 или новее.331332#### `[xml.parsers.expat.xmlparser.ElementDeclHandler]xmlparser.ElementDeclHandler(name, model)`333334Вызывается один раз для каждого объявления типа элемента.335336*name*337338– это имя типа элемента, а339340*model*341342– представление модели содержимого.343344#### `[xml.parsers.expat.xmlparser.AttlistDeclHandler]xmlparser.AttlistDeclHandler(elname, attname, type, default, required)`345346Вызывается для каждого объявленного атрибута типа элемента. Если в объявлении списка атрибутов объявлено три атрибута, этот обработчик вызывается три раза, по одному на каждый атрибут.347348*elname*349350– это имя элемента, к которому относится объявление, а351352*attname*353354– имя объявленного атрибута. Тип атрибута – это строка, передаваемая как355356*type*357358; возможные значения:359360`'CDATA'`361362,363364`'ID'`365366,367368`'IDREF'`369370, ...371372*default*373374задаёт значение по умолчанию для атрибута, используемое, когда атрибут не указан в экземпляре документа, или375376`None`377378, если значения по умолчанию нет (значения379380`#IMPLIED`381382). Если атрибут требуется указывать в экземпляре документа,383384*required*385386будет иметь значение true. Требуется Expat версии 1.95.0 или новее.387388#### `[xml.parsers.expat.xmlparser.StartElementHandler]xmlparser.StartElementHandler(name, attributes)`389390Вызывается в начале каждого элемента.391392*name*393394– строка, содержащая имя элемента, а395396*attributes*397398– словарь, сопоставляющий имена атрибутов с их значениями.399400#### `[xml.parsers.expat.xmlparser.EndElementHandler]xmlparser.EndElementHandler(name)`401402Вызывается для конца каждого элемента.403404#### `[xml.parsers.expat.xmlparser.ProcessingInstructionHandler]xmlparser.ProcessingInstructionHandler(target, data)`405406Вызывается для каждой инструкции по обработке.407408#### `[xml.parsers.expat.xmlparser.CharacterDataHandler]xmlparser.CharacterDataHandler(data)`409410Вызывается для символьных данных. Будет вызываться для обычных символьных данных, CDATA-разметки и игнорируемых пробелов. Приложения, которые должны различать эти случаи, могут использовать колбэки411412[`StartCdataSectionHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.StartCdataSectionHandler)413414,415416[`EndCdataSectionHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler)417418и419420[`ElementDeclHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.ElementDeclHandler)421422для сбора необходимой информации.423424#### `[xml.parsers.expat.xmlparser.UnparsedEntityDeclHandler]xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)`425426Вызывается для объявлений неразобранных (NDATA) сущностей. Доступно только для версии 1.2 библиотеки Expat; для более новых версий используйте427428[`EntityDeclHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.EntityDeclHandler)429430. (Соответствующая функция в библиотеке Expat признана устаревшей.)431432#### `[xml.parsers.expat.xmlparser.EntityDeclHandler]xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)`433434Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей435436*value*437438будет строкой, содержащей объявленное содержимое сущности; для внешних сущностей этот параметр будет равен439440`None`441442. Параметр443444*notationName*445446будет равен447448`None`449450для разобранных сущностей и имени нотации для неразобранных сущностей. Параметр451452*is\_parameter\_entity*453454будет истинным, если сущность является параметрической, и ложным для общих сущностей (большинству приложений нужно работать только с общими сущностями). Это доступно только начиная с версии 1.95.0 библиотеки Expat.455456#### `[xml.parsers.expat.xmlparser.NotationDeclHandler]xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)`457458Вызывается для объявлений нотаций. Параметры459460*notationName*461462,463464*base*465466,467468*systemId*469470и471472*publicId*473474, если заданы, являются строками. Если публичный идентификатор опущен,475476*publicId*477478будет равен479480`None`481482.483484#### `[xml.parsers.expat.xmlparser.StartNamespaceDeclHandler]xmlparser.StartNamespaceDeclHandler(prefix, uri)`485486Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова487488[`StartElementHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.StartElementHandler)489490для элемента, в котором эти объявления расположены.491492#### `[xml.parsers.expat.xmlparser.EndNamespaceDeclHandler]xmlparser.EndNamespaceDeclHandler(prefix)`493494Вызывается при достижении закрывающего тега элемента, содержавшего объявление пространства имён. Этот обработчик вызывается один раз для каждого объявления пространства имён в элементе в порядке, обратном тому, в котором вызывался495496[`StartNamespaceDeclHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.StartNamespaceDeclHandler)497498для указания начала области действия каждого объявления пространства имён. Вызовы этого обработчика производятся после соответствующего499500[`EndElementHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.EndElementHandler)501502для окончания элемента.503504#### `[xml.parsers.expat.xmlparser.CommentHandler]xmlparser.CommentHandler(data)`505506Вызывается для комментариев.507508*data*509510– это текст комментария, за исключением начального ‘511512`<!-`513514`-`515516‘ и конечного ‘517518`-`519520`->`521522‘.523524#### `[xml.parsers.expat.xmlparser.StartCdataSectionHandler]xmlparser.StartCdataSectionHandler()`525526Вызывается в начале секции CDATA. Этот обработчик и527528[`EndCdataSectionHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.EndCdataSectionHandler)529530необходимы для определения синтаксического начала и конца секций CDATA.531532#### `[xml.parsers.expat.xmlparser.EndCdataSectionHandler]xmlparser.EndCdataSectionHandler()`533534Вызывается в конце секции CDATA.535536#### `[xml.parsers.expat.xmlparser.DefaultHandler]xmlparser.DefaultHandler(data)`537538Вызывается для любых символов в XML-документе, для которых не был указан подходящий обработчик. Это символы, которые являются частью конструкции, о которой можно было бы сообщить, но для которой не предоставлен обработчик.539540#### `[xml.parsers.expat.xmlparser.DefaultHandlerExpand]xmlparser.DefaultHandlerExpand(data)`541542Это то же самое, что и543544[`DefaultHandler()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler)545546, но не препятствует разворачиванию внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.547548#### `[xml.parsers.expat.xmlparser.NotStandaloneHandler]xmlparser.NotStandaloneHandler()`549550Вызывается, если XML-документ не объявлен как отдельный (standalone) документ. Это происходит, когда присутствует внешнее подмножество или ссылка на параметрическую сущность, но в XML-декларации атрибут standalone не установлен в551552`yes`553554. Если этот обработчик возвращает555556`0`557558, то анализатор вызовет ошибку559560`XML_ERROR_NOT_STANDALONE`561562. Если этот обработчик не установлен, анализатор не генерирует исключение в этом случае.563564#### `[xml.parsers.expat.xmlparser.ExternalEntityRefHandler]xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)`565566Вызывается для ссылок на внешние сущности. Параметр *base* – это текущий базовый URI, установленный предыдущим вызовом [`SetBase()`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.SetBase). Публичный и системный идентификаторы *systemId* и *publicId*, если заданы, являются строками; если публичный идентификатор не задан, *publicId* будет равен `None`. Значение *context* является непрозрачным и должно использоваться только так, как описано ниже.567568Для разбора внешних сущностей этот обработчик должен быть реализован. Он отвечает за создание под-анализатора с помощью `ExternalEntityParserCreate(context)`, инициализацию его соответствующими колбэками и разбор сущности. Этот обработчик должен возвращать целое число; если он возвращает `0`, анализатор вызовет ошибку `XML_ERROR_EXTERNAL_ENTITY_HANDLING`, иначе разбор продолжится.569570Если этот обработчик не предоставлен, внешние сущности сообщаются через колбэк [`DefaultHandler`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.xmlparser.DefaultHandler), если он установлен.571572## Исключения ExpatError573574Исключения [`ExpatError`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ExpatError) имеют ряд интересных атрибутов:575576#### `[xml.parsers.expat.ExpatError.code]ExpatError.code`577578Внутренний номер ошибки Expat для конкретной ошибки. Он соответствует одной из констант, определённых в объекте579580`errors`581582из этого модуля.583584#### `[xml.parsers.expat.ExpatError.lineno]ExpatError.lineno`585586Номер строки, в которой обнаружена ошибка. Первая строка нумеруется как587588`1`589590.591592#### `[xml.parsers.expat.ExpatError.offset]ExpatError.offset`593594Смещение символов внутри строки, где произошла ошибка. Первый столбец нумеруется как595596`0`597598.599600## Пример601602Следующая программа определяет три обработчика, которые просто выводят свои аргументы.603604```python605import xml.parsers.expat606607# 3 функции-обработчика608def start_element(name, attrs):609    print('Start element:', name, attrs)610def end_element(name):611    print('End element:', name)612def char_data(data):613    print('Character data:', repr(data))614615p = xml.parsers.expat.ParserCreate()616617p.StartElementHandler = start_element618p.EndElementHandler = end_element619p.CharacterDataHandler = char_data620621p.Parse("""<?xml version="1.0"?>622<parent id="top"><child1 name="paul">Text goes here</child1>623<child2 name="fred">More text</child2>624</parent>""", 1)625```626627Результат работы этой программы:628629```python630Start element: parent {'id': 'top'}631Start element: child1 {'name': 'paul'}632Character data: 'Text goes here'633End element: child1634Character data: '\n'635Start element: child2 {'name': 'fred'}636Character data: 'More text'637End element: child2638Character data: '\n'639End element: parent640```641642## Описания моделей содержимого643644Модули содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы – это просто дополнительные описания модулей содержимого.645646Значения первых двух полей – это константы, определённые в объекте `model` модуля `xml.parsers.expat`. Эти константы можно разделить на две группы: группа типов моделей и группа квантификаторов.647648Константы группы типов моделей:649650#### `xml.parsers.expat.XML_CTYPE_ANY`651652Элемент, названный именем модели, был объявлен с моделью содержимого653654`ANY`655656.657658#### `xml.parsers.expat.XML_CTYPE_CHOICE`659660Именованный элемент допускает выбор из нескольких вариантов; это используется для моделей содержимого, таких как661662`(A | B | C)`663664.665666#### `xml.parsers.expat.XML_CTYPE_EMPTY`667668Элементы, объявленные как669670`EMPTY`671672, имеют этот тип модели.673674#### `xml.parsers.expat.XML_CTYPE_MIXED`675676#### `xml.parsers.expat.XML_CTYPE_NAME`677678#### `xml.parsers.expat.XML_CTYPE_SEQ`679680Модели, представляющие последовательность моделей, следующих одна за другой, обозначаются этим типом модели. Это используется для моделей, таких как681682`(A, B, C)`683684.685686Константы группы квантификаторов:687688#### `xml.parsers.expat.XML_CQUANT_NONE`689690Модификатор не указан, поэтому элемент может появиться ровно один раз, как для691692`A`693694.695696#### `xml.parsers.expat.XML_CQUANT_OPT`697698Модель является необязательной: она может появиться один раз или не появиться вовсе, как для699700`A?`701702.703704#### `xml.parsers.expat.XML_CQUANT_PLUS`705706Модель должна встречаться один или более раз (как707708`A+`709710).711712#### `xml.parsers.expat.XML_CQUANT_REP`713714Модель должна встречаться ноль или более раз, как для715716`A*`717718.719720## Константы ошибок Expat721722Следующие константы предоставлены в объекте `errors` модуля `xml.parsers.expat`. Эти константы полезны для интерпретации некоторых атрибутов объектов исключения [`ExpatError`](https://python-all.ru/3.0/library/pyexpat.html#xml.parsers.expat.ExpatError), которые возбуждаются при возникновении ошибки.723724Объект `errors` имеет следующие атрибуты:725726#### `xml.parsers.expat.XML_ERROR_ASYNC_ENTITY`727728#### `xml.parsers.expat.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`729730Ссылка на сущность в значении атрибута указывала на внешнюю сущность вместо внутренней.731732#### `xml.parsers.expat.XML_ERROR_BAD_CHAR_REF`733734Ссылка на символ указала на символ, недопустимый в XML (например, символ735736`0`737738или ‘739740`&#0;`741742‘).743744#### `xml.parsers.expat.XML_ERROR_BINARY_ENTITY_REF`745746Ссылка на сущность указывала на сущность, объявленную с помощью нотации, поэтому её невозможно разобрать.747748#### `xml.parsers.expat.XML_ERROR_DUPLICATE_ATTRIBUTE`749750Атрибут был использован более одного раза в одном открывающем теге.751752#### `xml.parsers.expat.XML_ERROR_INCORRECT_ENCODING`753754#### `xml.parsers.expat.XML_ERROR_INVALID_TOKEN`755756Возникает, когда входной байт не удаётся правильно сопоставить с символом; например, нулевой байт (значение757758`0`759760) во входном потоке UTF-8.761762#### `xml.parsers.expat.XML_ERROR_JUNK_AFTER_DOC_ELEMENT`763764После корневого элемента встретилось что-то, кроме пробельных символов.765766#### `xml.parsers.expat.XML_ERROR_MISPLACED_XML_PI`767768Объявление XML обнаружено не в начале входных данных.769770#### `xml.parsers.expat.XML_ERROR_NO_ELEMENTS`771772Документ не содержит ни одного элемента (XML требует, чтобы каждый документ содержал ровно один корневой элемент).773774#### `xml.parsers.expat.XML_ERROR_NO_MEMORY`775776Expat не смог выделить память внутри себя.777778#### `xml.parsers.expat.XML_ERROR_PARAM_ENTITY_REF`779780Ссылка на параметрическую сущность обнаружена там, где она не допускается.781782#### `xml.parsers.expat.XML_ERROR_PARTIAL_CHAR`783784Во входных данных обнаружен неполный символ.785786#### `xml.parsers.expat.XML_ERROR_RECURSIVE_ENTITY_REF`787788Ссылка на сущность содержала другую ссылку на ту же самую сущность; возможно, через другое имя, и возможно, косвенную.789790#### `xml.parsers.expat.XML_ERROR_SYNTAX`791792Обнаружена некоторая неопределённая синтаксическая ошибка.793794#### `xml.parsers.expat.XML_ERROR_TAG_MISMATCH`795796Закрывающий тег не соответствует самому внутреннему открытому открывающему тегу.797798#### `xml.parsers.expat.XML_ERROR_UNCLOSED_TOKEN`799800Какой-то токен (например, открывающий тег) не был закрыт до конца потока или до встречи следующего токена.801802#### `xml.parsers.expat.XML_ERROR_UNDEFINED_ENTITY`803804Ссылка на неопределённую сущность.805806#### `xml.parsers.expat.XML_ERROR_UNKNOWN_ENCODING`807808Кодировка документа не поддерживается Expat.809810#### `xml.parsers.expat.XML_ERROR_UNCLOSED_CDATA_SECTION`811812Раздел CDATA не был закрыт.813814#### `xml.parsers.expat.XML_ERROR_EXTERNAL_ENTITY_HANDLING`815816#### `xml.parsers.expat.XML_ERROR_NOT_STANDALONE`817818Парсер определил, что документ не является “standalone”, хотя в XML-декларации он был объявлен таковым, и обработчик819820`NotStandaloneHandler`821822был установлен и вернул823824`0`825826.827828#### `xml.parsers.expat.XML_ERROR_UNEXPECTED_STATE`829830#### `xml.parsers.expat.XML_ERROR_ENTITY_DECLARED_IN_PE`831832#### `xml.parsers.expat.XML_ERROR_FEATURE_REQUIRES_XML_DTD`833834Была запрошена операция, требующая встроенной поддержки DTD, но Expat был сконфигурирован без поддержки DTD. Это не должно сообщаться стандартной сборкой модуля835836`xml.parsers.expat`837838.839840#### `xml.parsers.expat.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`841842Запрошено изменение поведения после начала синтаксического анализа, хотя его можно изменить только до начала анализа. На данный момент это исключение генерируется только функцией843844`UseForeignDTD()`845846.847848#### `xml.parsers.expat.XML_ERROR_UNBOUND_PREFIX`849850При включённой обработке пространств имён обнаружен необъявленный префикс.851852#### `xml.parsers.expat.XML_ERROR_UNDECLARING_PREFIX`853854Документ пытается удалить объявление пространства имён, связанное с префиксом.855856#### `xml.parsers.expat.XML_ERROR_INCOMPLETE_PE`857858Параметрическая сущность содержит неполную разметку.859860#### `xml.parsers.expat.XML_ERROR_XML_DECL`861862В документе отсутствует корневой элемент.863864#### `xml.parsers.expat.XML_ERROR_TEXT_DECL`865866Ошибка при разборе текстовой декларации во внешней сущности.867868#### `xml.parsers.expat.XML_ERROR_PUBLICID`869870В публичном идентификаторе обнаружены недопустимые символы.871872#### `xml.parsers.expat.XML_ERROR_SUSPENDED`873874Запрошенная операция выполнена на приостановленном парсере, но не разрешена. Сюда входят попытки передать дополнительные данные или остановить парсер.875876#### `xml.parsers.expat.XML_ERROR_NOT_SUSPENDED`877878Попытка возобновить работу парсера, когда он не был приостановлен.879880#### `xml.parsers.expat.XML_ERROR_ABORTED`881882Это не должно сообщаться приложениям Python.883884#### `xml.parsers.expat.XML_ERROR_FINISHED`885886Попытка выполнить операцию над парсером, который уже закончил разбор входных данных, но такая операция запрещена. Сюда относятся попытки передать дополнительные данные или остановить парсер.887888#### `xml.parsers.expat.XML_ERROR_SUSPEND_PE`889890Сноски891892| \[1\] | Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.0/library/pyexpat.html) и [http://www.iana.org/assignments/character-sets](https://python-all.ru/3.0/library/pyexpat.html) . |893| --- | --- |894