xml.parsers.expat — Быстрый разбор XML с помощью Expat
Примечание
Если вам нужно разобрать недоверенные или неаутентифицированные данные, см. раздел Безопасность XML.
Модуль xml.parsers.expat предоставляет интерфейс Python к непроверяющему XML-парсеру Expat. Модуль предоставляет единственный тип расширения — xmlparser, представляющий текущее состояние XML-парсера. После создания объекта xmlparser различные атрибуты объекта можно назначить функциям-обработчикам. Когда XML-документ передаётся парсеру, функции-обработчики вызываются для символьных данных и разметки в XML-документе.
Этот модуль использует модуль pyexpat для доступа к парсеру Expat. Прямое использование модуля pyexpat устарело.
Этот модуль предоставляет одно исключение и один объект типа:
-
exception xml.parsers.expat.ExpatError -
Исключение, возникающее, когда Expat сообщает об ошибке. Дополнительные сведения об интерпретации ошибок Expat см. в разделе Исключения ExpatError.
-
exception xml.parsers.expat.error -
Псевдоним для
ExpatError.
-
xml.parsers.expat.XMLParserType -
Тип возвращаемых значений функции
ParserCreate().
Модуль xml.parsers.expat содержит две функции:
-
xml.parsers.expat.ErrorString(errno) -
Возвращает поясняющую строку для заданного номера ошибки errno.
-
xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None) -
Создаёт и возвращает новый объект
xmlparser. Если параметр encoding указан, он должен быть строкой с названием кодировки, используемой XML-данными. Expat поддерживает меньше кодировок, чем Python, и его набор кодировок нельзя расширить; он поддерживает UTF-8, UTF-16, ISO-8859-1 (Latin1) и ASCII. Если задан параметр encoding [1], он переопределит неявную или явную кодировку документа.Парсеры, созданные с помощью
ParserCreate(), называются «корневыми» в том смысле, что к ним не присоединён родительский парсер. Некорневые парсеры создаются с помощьюparser.ExternalEntityParserCreate.Expat может выполнять обработку пространств имён XML, если передать значение параметра namespace_separator. Значение должно быть строкой из одного символа; если длина строки недопустима (
Noneсчитается эквивалентом отсутствия значения), будет вызвано исключениеValueError. При включённой обработке пространств имён имена типов элементов и атрибутов, принадлежащих пространству имён, будут развёрнуты. Имя элемента, передаваемое обработчикам элементовStartElementHandlerиEndElementHandler, будет представлять собой конкатенацию URI пространства имён, символа-разделителя пространства имён и локальной части имени. Если разделителем пространства имён служит нулевой байт (chr(0)), URI пространства имён и локальная часть будут объединены без разделителя.Например, если в качестве namespace_separator задан пробел (
' ') и разбирается следующий документ:<?xml version="1.0"?> <root xmlns = "http://default-namespace.org/" xmlns:py = "http://www.python.org/ns/"> <py:elem1 /> <elem2 xmlns="" /> </root>StartElementHandlerполучит следующие строки для каждого элемента:http://default-namespace.org/ root http://www.python.org/ns/ elem1 elem2
Из-за ограничений библиотеки
Expat, используемойpyexpat, возвращённый экземплярxmlparserможно использовать только для разбора одного XML-документа. Для каждого документа вызывайтеParserCreate, чтобы создавать уникальные экземпляры парсера.
См. также
- XML-парсер Expat
-
Домашняя страница проекта Expat.
Объекты XMLParser
Объекты xmlparser имеют следующие методы:
-
xmlparser.Parse(data[, isfinal]) -
Анализирует содержимое строки data, вызывая соответствующие функции-обработчики для обработки разобранных данных. При последнем вызове этого метода значение isfinal должно быть истинным; это позволяет анализировать один файл по фрагментам, а не передавать несколько файлов. В любой момент data может быть пустой строкой.
-
xmlparser.ParseFile(file) -
Анализирует данные XML, считывая их из объекта file. Объекту file достаточно предоставлять метод
read(nbytes), возвращающий пустую строку, когда данные заканчиваются.
-
xmlparser.SetBase(base) -
Задаёт базовый адрес для разрешения относительных URI в системных идентификаторах объявлений. Разрешение относительных идентификаторов остаётся на усмотрение приложения: это значение передаётся в качестве аргумента base функциям
ExternalEntityRefHandler(),NotationDeclHandler()иUnparsedEntityDeclHandler().
-
xmlparser.GetBase() -
Возвращает строку с базовым адресом, заданным предыдущим вызовом
SetBase(), илиNone, еслиSetBase()не вызывался.
-
xmlparser.GetInputContext() -
Возвращает в виде строки входные данные, вызвавшие текущее событие. Данные представлены в кодировке сущности, содержащей этот текст. Если метод вызван, когда обработчик события не активен, возвращаемым значением будет
None.
-
xmlparser.ExternalEntityParserCreate(context[, encoding]) -
Создаёт «дочерний» анализатор, который можно использовать для анализа внешней разобранной сущности, на которую ссылаются данные, разобранные родительским анализатором. Параметр context должен содержать строку, переданную обработчику
ExternalEntityRefHandler(), описанному ниже. Дочерний анализатор создаётся со значениямиordered_attributesиspecified_attributes, равными значениям этих атрибутов родительского анализатора.
-
xmlparser.SetParamEntityParsing(flag) -
Управляет анализом параметрических сущностей (включая внешнее подмножество DTD). Возможные значения flag:
XML_PARAM_ENTITY_PARSING_NEVER,XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEиXML_PARAM_ENTITY_PARSING_ALWAYS. Возвращает true, если установить флаг удалось.
-
xmlparser.UseForeignDTD([flag]) -
Если вызвать этот метод со значением true для flag (значение по умолчанию), Expat вызовет обработчик
ExternalEntityRefHandler, передавNoneво всех аргументах, чтобы разрешить загрузку альтернативного DTD. Если документ не содержит объявления типа документа, обработчикExternalEntityRefHandlerвсё равно будет вызван, но обработчикиStartDoctypeDeclHandlerиEndDoctypeDeclHandlerвызваны не будут.Передача ложного значения для flag отменяет предыдущий вызов с истинным значением, но в остальных случаях не оказывает эффекта.
Этот метод можно вызывать только до вызова методов
Parse()илиParseFile(). Вызов после любого из них приводит к возникновению исключенияExpatErrorс атрибутомcode, установленным вerrors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING].
-
xmlparser.SetReparseDeferralEnabled(enabled) -
Предупреждение
Вызов
SetReparseDeferralEnabled(False)имеет последствия для безопасности, описанные ниже; прежде чем использовать методSetReparseDeferralEnabled, обязательно ознакомьтесь с ними.В Expat 2.6.0 был добавлен механизм безопасности, называемый «отсрочкой повторного анализа»: вместо того чтобы допускать отказ в обслуживании из-за квадратичного времени выполнения при повторном анализе больших токенов, повторный анализ незавершённых токенов теперь по умолчанию откладывается до получения достаточного объёма входных данных. Из-за этой задержки зарегистрированные обработчики могут вызываться не сразу после передачи новых входных данных анализатору — в зависимости от размера передаваемых Expat фрагментов. Если требуется немедленная обратная связь и при этом ответственность за защиту от отказа в обслуживании из-за больших токенов должна быть полностью возложена на вызывающий код, вызов
SetReparseDeferralEnabled(False)отключает отсрочку повторного анализа для текущего экземпляра анализатора Expat — временно или полностью. ВызовSetReparseDeferralEnabled(True)позволяет снова включить отсрочку повторного анализа.Обратите внимание, что
SetReparseDeferralEnabled()было перенесено в некоторые предыдущие выпуски CPython в качестве исправления безопасности. Если код используется в разных версиях Python, проверяйте наличиеSetReparseDeferralEnabled()с помощьюhasattr().Добавлено в версии 3.13.
-
xmlparser.GetReparseDeferralEnabled() -
Возвращает информацию о том, включена ли в данный момент отсрочка повторного анализа для указанного экземпляра анализатора Expat.
Добавлено в версии 3.13.
Объекты xmlparser предоставляют следующие методы для настройки защиты от некоторых распространённых уязвимостей XML.
-
xmlparser.SetBillionLaughsAttackProtectionActivationThreshold(threshold, /) -
Задаёт количество выходных байтов, необходимое для активации защиты от атак типа «миллиард смехов».
Количество выходных байтов включает увеличение объёма данных из-за раскрытия сущностей и чтения файлов DTD.
Обычно порог активации защиты для объектов-анализаторов составляет 8 МиБ, однако фактическое значение по умолчанию зависит от используемой библиотеки Expat.
Если вызвать этот метод для не корневого анализатора, будет вызвано исключение
ExpatError. Соответствующие атрибутыlinenoиoffsetиспользовать не следует, поскольку они могут не иметь особого смысла.Примечание
Известно, что пороги активации ниже 4 МиБ нарушают поддержку данных DITA 1.3, поэтому использовать их не рекомендуется.
Добавлено в версии 3.14.6.
-
xmlparser.SetBillionLaughsAttackProtectionMaximumAmplification(max_factor, /) -
Задаёт максимально допустимый коэффициент усиления для защиты от атак типа «миллиард смехов».
Коэффициент усиления при анализе вычисляется как
(direct + indirect) / direct, гдеdirect— количество байтов, считанных из основного документа в процессе анализа, аindirect— количество байтов, добавленных при раскрытии сущностей и чтении внешних файлов DTD.Значение max_factor должно быть числом типа
float, не равным NaN и не меньшим 1.0. На практике в небольших безвредных файлах наблюдались пиковые коэффициенты усиления 15 000 для всего содержимого и 30 000 в середине анализа. В частности, порог активации следует выбирать тщательно, чтобы избежать ложных срабатываний.Обычно максимальный коэффициент усиления для объектов-анализаторов составляет 100, однако фактическое значение по умолчанию зависит от используемой библиотеки Expat.
Если вызвать этот метод для не корневого анализатора или если значение max_factor выходит за допустимый диапазон, будет вызвано исключение
ExpatError. Соответствующие атрибутыlinenoиoffsetиспользовать не следует, поскольку они могут не иметь особого смысла.Примечание
Максимальный коэффициент усиления учитывается только в том случае, если превышен порог, который можно настроить с помощью
SetBillionLaughsAttackProtectionActivationThreshold().Добавлено в версии 3.14.6.
-
xmlparser.SetAllocTrackerActivationThreshold(threshold, /) -
Задаёт количество выделенных байтов динамической памяти, необходимое для активации защиты от чрезмерного использования оперативной памяти.
Обычно порог активации защиты для объектов-анализаторов составляет 64 МиБ, однако фактическое значение по умолчанию зависит от используемой библиотеки Expat.
Если вызвать этот метод для не корневого анализатора, будет вызвано исключение
ExpatError. Соответствующие атрибутыlinenoиoffsetиспользовать не следует, поскольку они могут не иметь особого смысла.Добавлено в версии 3.14.1.
-
xmlparser.SetAllocTrackerMaximumAmplification(max_factor, /) -
Задаёт максимальный коэффициент усиления, то есть отношение объёма непосредственно переданных данных к объёму выделенной динамической памяти.
Коэффициент усиления при анализе вычисляется как
allocated / direct, гдеdirect— количество байтов, считанных из основного документа в процессе анализа, аallocated— количество байтов динамической памяти, выделенной в иерархии анализаторов.Значение max_factor должно быть числом типа
float, не равным NaN и не меньшим 1.0. На практике даже для безвредных файлов в начале анализа могут наблюдаться коэффициенты усиления выше 100.0. В частности, порог активации следует выбирать тщательно, чтобы избежать ложных срабатываний.Обычно максимальный коэффициент усиления для объектов-анализаторов составляет 100, однако фактическое значение по умолчанию зависит от используемой библиотеки Expat.
Если вызвать этот метод для не корневого анализатора или если значение max_factor выходит за допустимый диапазон, будет вызвано исключение
ExpatError. Соответствующие атрибутыlinenoиoffsetиспользовать не следует, поскольку они могут не иметь особого смысла.Примечание
Максимальный коэффициент усиления учитывается только в том случае, если превышен порог, который можно настроить с помощью
SetAllocTrackerActivationThreshold().Добавлено в версии 3.14.1.
Объекты xmlparser имеют следующие атрибуты:
-
xmlparser.buffer_size -
Размер буфера, используемого, когда
buffer_textимеет значение true. Новый размер буфера можно задать, присвоив этому атрибуту новое целое значение. При изменении размера буфер будет очищен.
-
xmlparser.buffer_text -
Если установить для этого атрибута значение true, объект
xmlparserбудет буферизовать текстовое содержимое, возвращаемое Expat, чтобы по возможности избежать многократных вызовов обратного вызоваCharacterDataHandler(). Это может значительно повысить производительность, поскольку Expat обычно разбивает текстовые данные на фрагменты по каждому символу конца строки. По умолчанию этот атрибут имеет значение false; его можно изменять в любой момент. Обратите внимание: если атрибут имеет значение false, на фрагменты могут разбиваться и данные без символов новой строки.
-
xmlparser.buffer_used -
Если включён атрибут
buffer_text, количество байтов, хранящихся в буфере. Эти байты представляют собой текст в кодировке UTF-8. Еслиbuffer_textимеет значение false, этот атрибут не имеет значимой интерпретации.
-
xmlparser.ordered_attributes -
Если задать этому атрибуту ненулевое целое значение, атрибуты будут возвращаться в виде списка, а не словаря. Атрибуты перечисляются в том порядке, в котором они встречаются в тексте документа. Для каждого атрибута в список включаются две записи: имя атрибута и его значение. (В старых версиях этого модуля также использовался такой формат.) По умолчанию этот атрибут имеет значение false; его можно изменять в любой момент.
-
xmlparser.specified_attributes -
Если задать этому атрибуту ненулевое целое значение, анализатор будет возвращать только атрибуты, указанные в экземпляре документа, и не будет возвращать атрибуты, значения которых получены из объявлений атрибутов. Приложениям, задающим это значение, следует проявлять особую осторожность и использовать доступную дополнительную информацию из объявлений, чтобы обеспечить соответствие стандартам поведения XML-процессоров. По умолчанию этот атрибут имеет значение false; его можно изменять в любой момент.
Следующие атрибуты содержат значения, связанные с последней ошибкой, возникшей в объекте xmlparser, и будут иметь корректные значения только после того, как вызов Parse() или ParseFile() привёл к возникновению исключения xml.parsers.expat.ExpatError.
-
xmlparser.ErrorByteIndex -
Индекс байта, на котором произошла ошибка.
-
xmlparser.ErrorCode -
Числовой код, указывающий на проблему. Это значение можно передать функции
ErrorString()или сравнить с одной из констант, определённых в объектеerrors.
-
xmlparser.ErrorColumnNumber -
Номер столбца, в котором произошла ошибка.
-
xmlparser.ErrorLineNumber -
Номер строки, в которой произошла ошибка.
Следующие атрибуты содержат значения, относящиеся к текущему месту анализа в объекте xmlparser. Во время обратного вызова, сообщающего о событии анализа, они указывают на позицию первого символа в последовательности, вызвавшей это событие. При вызове вне обратного вызова указанная позиция будет находиться сразу после последнего события анализа (независимо от того, был ли для него вызван соответствующий обратный вызов).
-
xmlparser.CurrentByteIndex -
Текущий индекс байта во входных данных анализатора.
-
xmlparser.CurrentColumnNumber -
Текущий номер столбца во входных данных анализатора.
-
xmlparser.CurrentLineNumber -
Текущий номер строки во входных данных анализатора.
Ниже приведён список обработчиков, которые можно задать. Чтобы задать обработчик для объекта xmlparser o, используйте o.handlername = func. Значение handlername должно быть выбрано из приведённого ниже списка, а func должно быть вызываемым объектом, принимающим правильное число аргументов. Все аргументы являются строками, если не указано иное.
-
xmlparser.XmlDeclHandler(version, encoding, standalone) -
Вызывается при разборе объявления XML. Объявление XML — это необязательное объявление применимой версии рекомендации XML, кодировки текста документа и необязательное объявление «standalone». Значения version и encoding будут строками, а standalone будет равно
1, если документ объявлен автономным,0, если объявлено, что он не является автономным, или-1, если часть об автономности опущена. Доступно только в Expat версии 1.95.0 или новее.
-
xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset) -
Вызывается, когда Expat начинает разбор объявления типа документа (
<!DOCTYPE ...). Значение doctypeName передаётся точно в том виде, в каком оно указано. Параметры systemId и publicId содержат системный и публичный идентификаторы, если они указаны, илиNone, если они опущены. Значение has_internal_subset будет истинным, если документ содержит внутреннее подмножество объявления документа. Требуется Expat версии 1.2 или новее.
-
xmlparser.EndDoctypeDeclHandler() -
Вызывается, когда Expat завершает разбор объявления типа документа. Требуется Expat версии 1.2 или новее.
-
xmlparser.ElementDeclHandler(name, model) -
Вызывается один раз для каждого объявления типа элемента. name — имя типа элемента, а model — представление модели содержимого.
-
xmlparser.AttlistDeclHandler(elname, attname, type, default, required) -
Вызывается для каждого объявленного атрибута типа элемента. Если объявление списка атрибутов содержит три атрибута, этот обработчик вызывается трижды — по одному разу для каждого атрибута. elname — имя элемента, к которому относится объявление, а attname — имя объявленного атрибута. Тип атрибута передаётся в строке type; возможные значения:
'CDATA','ID','IDREF', … default задаёт значение атрибута по умолчанию, используемое, если атрибут не указан в экземпляре документа, илиNone, если значение по умолчанию отсутствует (значения#IMPLIED). Если атрибут обязательно должен быть указан в экземпляре документа, значение required будет истинным. Требуется Expat версии 1.95.0 или новее.
-
xmlparser.StartElementHandler(name, attributes) -
Вызывается при начале каждого элемента. name — строка с именем элемента, а attributes — атрибуты элемента. Если
ordered_attributesимеет значение true, это будет список (полное описание см. вordered_attributes). В противном случае это будет словарь, сопоставляющий имена и значения.
-
xmlparser.EndElementHandler(name) -
Вызывается при завершении каждого элемента.
-
xmlparser.ProcessingInstructionHandler(target, data) -
Вызывается для каждой инструкции обработки.
-
xmlparser.CharacterDataHandler(data) -
Вызывается для символьных данных. Обработчик вызывается для обычных символьных данных, содержимого, помеченного CDATA, и игнорируемых пробельных символов. Приложения, которым необходимо различать эти случаи, могут использовать обратные вызовы
StartCdataSectionHandler,EndCdataSectionHandlerиElementDeclHandler, чтобы собрать необходимые сведения. Обратите внимание: символьные данные могут разбиваться на фрагменты, даже если они короткие, поэтому вызовCharacterDataHandler()может произойти несколько раз. Чтобы этого избежать, установите атрибут экземпляраbuffer_textвTrue.
-
xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName) -
Вызывается для объявлений неразобранных сущностей (NDATA). Этот обработчик имеется только в версии 1.2 библиотеки Expat; в более новых версиях вместо него следует использовать
EntityDeclHandler. (Соответствующая функция в библиотеке Expat объявлена устаревшей.)
-
xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName) -
Вызывается для всех объявлений сущностей. Для параметрических и внутренних сущностей value будет строкой с объявленным содержимым сущности; для внешних сущностей это значение будет
None. Для разобранных сущностей параметр notationName будет равенNone, а для неразобранных сущностей будет содержать имя нотации. Значение is_parameter_entity будет истинным, если сущность является параметрической, и ложным для общих сущностей (большинству приложений требуется учитывать только общие сущности). Доступно начиная с версии 1.95.0 библиотеки Expat.
-
xmlparser.NotationDeclHandler(notationName, base, systemId, publicId) -
Вызывается для объявлений нотаций. Параметры notationName, base, systemId и publicId являются строками, если заданы. Если публичный идентификатор опущен, значение publicId будет равно
None.
-
xmlparser.StartNamespaceDeclHandler(prefix, uri) -
Вызывается, когда элемент содержит объявление пространства имён. Объявления пространств имён обрабатываются до вызова
StartElementHandlerдля элемента, в котором размещены объявления.
-
xmlparser.EndNamespaceDeclHandler(prefix) -
Вызывается при достижении закрывающего тега элемента, содержащего объявление пространства имён. Обработчик вызывается для каждого объявления пространства имён элемента в порядке, обратном порядку вызова
StartNamespaceDeclHandler, обозначавшего начало области действия каждого объявления. Вызовы этого обработчика выполняются после соответствующегоEndElementHandler, обозначающего завершение элемента.
-
xmlparser.CommentHandler(data) -
Вызывается для комментариев. data содержит текст комментария без начальных
'<!--'и конечных'-->'.
-
xmlparser.StartCdataSectionHandler() -
Вызывается в начале раздела CDATA. Этот обработчик и
EndCdataSectionHandlerнеобходимы, чтобы можно было определить синтаксические начало и конец разделов CDATA.
-
xmlparser.EndCdataSectionHandler() -
Вызывается в конце раздела CDATA.
-
xmlparser.DefaultHandler(data) -
Вызывается для любых символов XML-документа, для которых не задан соответствующий обработчик. Это означает, что он вызывается для символов, входящих в конструкцию, о которой можно было бы сообщить, но для которой не предоставлен обработчик.
-
xmlparser.DefaultHandlerExpand(data) -
Это то же самое, что
DefaultHandler(), но без запрета на раскрытие внутренних сущностей. Ссылка на сущность не будет передана обработчику по умолчанию.
-
xmlparser.NotStandaloneHandler() -
Вызывается, если XML-документ не был объявлен как автономный документ. Это происходит, когда имеется внешнее подмножество или ссылка на параметрическую сущность, но в объявлении XML для standalone не задано значение
yes. Если этот обработчик возвращает0, анализатор вызовет ошибкуXML_ERROR_NOT_STANDALONE. Если этот обработчик не задан, анализатор не вызывает исключение при таком условии.
-
xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId) -
Предупреждение
Реализация обработчика, который обращается к локальным файлам и/или сети, может создать уязвимость к атакам с использованием внешних сущностей, если
xmlparserиспользуется с предоставленным пользователем XML-содержимым. Прежде чем реализовывать этот обработчик, обдумайте свою модель угроз.Вызывается для ссылок на внешние сущности. base — текущая базовая строка, заданная предыдущим вызовом
SetBase(). Публичный и системный идентификаторы systemId и publicId являются строками, если они заданы; если публичный идентификатор не задан, publicId будет равенNone. Значение context является непрозрачным и должно использоваться только так, как описано ниже.Чтобы анализировать внешние сущности, необходимо реализовать этот обработчик. Он отвечает за создание поданализатора с помощью
ExternalEntityParserCreate(context), его инициализацию соответствующими обратными вызовами и анализ сущности. Обработчик должен возвращать целое число; если он возвращает0, анализатор вызовет ошибкуXML_ERROR_EXTERNAL_ENTITY_HANDLING, в противном случае анализ продолжится.Если этот обработчик не предоставлен, сведения о внешних сущностях передаются обратному вызову
DefaultHandler, если он предоставлен.
Исключения ExpatError
Исключения ExpatError имеют несколько интересных атрибутов:
-
ExpatError.code -
Внутренний номер ошибки Expat, соответствующий конкретной ошибке. Словарь
errors.messagesсопоставляет эти номера ошибок с сообщениями об ошибках Expat. Например:from xml.parsers.expat import ParserCreate, ExpatError, errors p = ParserCreate() try: p.Parse(some_xml_document) except ExpatError as err: print("Error:", errors.messages[err.code])Модуль
errorsтакже предоставляет константы сообщений об ошибках и словарьcodes, сопоставляющий эти сообщения с кодами ошибок; см. ниже.
-
ExpatError.lineno -
Номер строки, в которой была обнаружена ошибка. Нумерация начинается с
1.
-
ExpatError.offset -
Позиция символа в строке, в которой произошла ошибка. Нумерация столбцов начинается с
0.
Пример
Следующая программа определяет три обработчика, которые просто выводят свои аргументы.
import xml.parsers.expat
# 3 handler functions
def start_element(name, attrs):
print('Start element:', name, attrs)
def end_element(name):
print('End element:', name)
def char_data(data):
print('Character data:', repr(data))
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
Результат выполнения этой программы:
Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
Описания моделей содержимого
Модели содержимого описываются с помощью вложенных кортежей. Каждый кортеж содержит четыре значения: тип, квантификатор, имя и кортеж дочерних элементов. Дочерние элементы — это просто дополнительные описания моделей содержимого.
Значения первых двух полей — константы, определённые в модуле xml.parsers.expat.model. Эти константы можно разделить на две группы: группу типов модели и группу квантификаторов.
Константы группы типов модели:
- xml.parsers.expat.model.XML_CTYPE_ANY
-
Для элемента, указанного в имени модели, была объявлена модель содержимого
ANY.
- xml.parsers.expat.model.XML_CTYPE_CHOICE
-
Для указанного элемента допускается выбор одного из нескольких вариантов; этот тип используется для моделей содержимого, таких как
(A | B | C).
- xml.parsers.expat.model.XML_CTYPE_EMPTY
-
Элементы, объявленные как
EMPTY, имеют этот тип модели.
- xml.parsers.expat.model.XML_CTYPE_MIXED
- xml.parsers.expat.model.XML_CTYPE_NAME
- xml.parsers.expat.model.XML_CTYPE_SEQ
-
Для моделей, представляющих последовательность моделей, следующих одна за другой, используется этот тип модели. Он применяется для таких моделей, как
(A, B, C).
Константы группы квантификаторов:
- xml.parsers.expat.model.XML_CQUANT_NONE
-
Модификатор не задан, поэтому элемент может появиться ровно один раз, как в
A.
- xml.parsers.expat.model.XML_CQUANT_OPT
-
Модель является необязательной: она может появиться один раз или не появиться вовсе, как в
A?.
- xml.parsers.expat.model.XML_CQUANT_PLUS
-
Модель должна встречаться один или более раз (например,
A+).
- xml.parsers.expat.model.XML_CQUANT_REP
-
Модель должна встречаться ноль или более раз, как в
A*.
Константы ошибок Expat
В модуле xml.parsers.expat.errors предоставлены следующие константы. Эти константы полезны для интерпретации некоторых атрибутов объектов исключения ExpatError, возникающих при ошибке. По соображениям обратной совместимости значением констант является текст сообщения об ошибке, а не её числовой код; для этого нужно сравнить атрибут code с errors.codes[errors.XML_ERROR_CONSTANT_NAME].
Модуль errors имеет следующие атрибуты:
-
xml.parsers.expat.errors.codes -
Словарь, сопоставляющий строковые описания кодам ошибок.
Добавлено в версии 3.2.
-
xml.parsers.expat.errors.messages -
Словарь, сопоставляющий числовые коды ошибок их строковым описаниям.
Добавлено в версии 3.2.
-
xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY
-
xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF -
Ссылка на сущность в значении атрибута указывала на внешнюю, а не на внутреннюю сущность.
-
xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF -
Ссылка на символ указывала на символ, недопустимый в XML (например, символ
0или «�»).
-
xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF -
Ссылка на сущность указывала на сущность, объявленную с нотацией, поэтому её нельзя проанализировать.
-
xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE -
Атрибут использовался более одного раза в начальном теге.
-
xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING
-
xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN -
Возникает, когда входному байту не удалось корректно сопоставить символ; например, при наличии нулевого байта (значение
0) во входном потоке UTF-8.
-
xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT -
После элемента документа встретилось что-то, кроме пробельных символов.
-
xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI -
Объявление XML обнаружено не в начале входных данных.
-
xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS -
Документ не содержит элементов (XML требует, чтобы каждый документ содержал ровно один элемент верхнего уровня)..
-
xml.parsers.expat.errors.XML_ERROR_NO_MEMORY -
Expat не удалось выделить память для внутренних нужд.
-
xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF -
Обнаружена ссылка на параметрическую сущность в месте, где она недопустима.
-
xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR -
Во входных данных обнаружен неполный символ.
-
xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF -
Ссылка на сущность содержала другую ссылку на ту же сущность — возможно, под другим именем и, возможно, косвенно.
-
xml.parsers.expat.errors.XML_ERROR_SYNTAX -
Обнаружена неуточнённая синтаксическая ошибка.
-
xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH -
Конечный тег не соответствует самому внутреннему открытому начальному тегу.
-
xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN -
Некоторый токен (например, начальный тег) не был закрыт до конца потока или до появления следующего токена.
-
xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY -
Была сделана ссылка на неопределённую сущность.
-
xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING -
Кодировка документа не поддерживается Expat.
-
xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION -
Раздел CDATA не был закрыт.
-
xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING
-
xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE -
Анализатор определил, что документ не является «автономным», хотя в объявлении XML он объявил себя таковым; при этом был задан
NotStandaloneHandler, который вернул0.
-
xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE
-
xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE
-
xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD -
Запрошена операция, для которой необходима поддержка DTD, включённая при сборке, но Expat был настроен без поддержки DTD. В стандартной сборке модуля
xml.parsers.expatтакая ошибка возникать не должна.
-
xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING -
После начала анализа запрошено изменение поведения, которое можно изменить только до начала анализа. В настоящее время эта ошибка возникает только в
UseForeignDTD().
-
xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX -
При включённой обработке пространств имён обнаружен необъявленный префикс.
-
xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX -
Документ пытался удалить объявление пространства имён, связанное с префиксом.
-
xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE -
Параметрическая сущность содержала неполную разметку.
-
xml.parsers.expat.errors.XML_ERROR_XML_DECL -
Документ вообще не содержал элемента документа.
-
xml.parsers.expat.errors.XML_ERROR_TEXT_DECL -
При анализе текстового объявления во внешней сущности произошла ошибка.
-
xml.parsers.expat.errors.XML_ERROR_PUBLICID -
В публичном идентификаторе обнаружены недопустимые символы.
-
xml.parsers.expat.errors.XML_ERROR_SUSPENDED -
Запрошенная операция была выполнена для приостановленного анализатора, но не допускается. К таким операциям относятся попытки передать дополнительные данные или остановить анализатор.
-
xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED -
Предпринята попытка возобновить анализатор, который не был приостановлен.
-
xml.parsers.expat.errors.XML_ERROR_ABORTED -
Эта ошибка не должна сообщаться приложениям Python.
-
xml.parsers.expat.errors.XML_ERROR_FINISHED -
Запрошенная операция была выполнена для анализатора, завершившего анализ входных данных, но не допускается. К таким операциям относятся попытки передать дополнительные данные или остановить анализатор.
-
xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE
-
xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML -
Предпринята попытка отменить объявление зарезервированного префикса пространства имён
xmlили связать его с другим URI пространства имён.
-
xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS -
Предпринята попытка объявить или отменить объявление зарезервированного префикса пространства имён
xmlns.
-
xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI -
Предпринята попытка связать URI одного из зарезервированных префиксов пространства имён
xmlиxmlnsс другим префиксом пространства имён.
-
xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT -
Эта ошибка не должна сообщаться приложениям Python.
-
xml.parsers.expat.errors.XML_ERROR_NO_BUFFER -
Эта ошибка не должна сообщаться приложениям Python.
-
xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH -
Превышено ограничение на коэффициент увеличения объёма входных данных (из DTD и сущностей).
-
xml.parsers.expat.errors.XML_ERROR_NOT_STARTED -
Была предпринята попытка остановить или приостановить анализатор до его запуска.
Добавлено в версии 3.14.
Сноски
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/pyexpat.html