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

20.6. xml.dom – API объектной модели документаxml.dom – The Document Object Model API

Объектная модель документа (DOM) – это независимый от языка программирования API, разработанный Консорциумом Всемирной паутины (W3C) для доступа к XML-документам и их изменения. Реализация DOM представляет XML-документ в виде древовидной структуры или позволяет клиентскому коду создать такую структуру с нуля. Затем она предоставляет доступ к структуре через набор объектов, которые предоставляют хорошо известные интерфейсы.

DOM чрезвычайно полезен для приложений с произвольным доступом. SAX позволяет видеть только один фрагмент документа за раз. Если рассматривается один элемент SAX, доступ к другому отсутствует. Если рассматривается текстовый узел, отсутствует доступ к содержащему его элементу. При написании приложения SAX необходимо отслеживать положение программы в документе в собственном коде – SAX не делает этого автоматически. Кроме того, если требуется заглянуть вперед в XML-документе, это просто невозможно.

Некоторые приложения просто невозможны в событийно-ориентированной модели без доступа к дереву. Конечно, можно построить некоторое подобие дерева самостоятельно, обрабатывая события SAX, но DOM позволяет избежать написания такого кода. DOM – это стандартное древовидное представление XML-данных.

Объектная модель документа (DOM) определяется W3C поэтапно, или, в их терминологии, по «уровням». Представление API в Python в значительной степени основано на рекомендации DOM уровня 2.

Приложения DOM обычно начинают с разбора XML в DOM. Как это делается, вообще не рассматривается в DOM Level 1, а Level 2 даёт лишь ограниченные улучшения: существует класс объектов DOMImplementation, который предоставляет доступ к методам создания Document, но нет способа получить средство чтения/парсер/построитель Document независимым от реализации образом. Также нет чёткого способа получить доступ к этим методам без существующего объекта Document. В Python каждая реализация DOM предоставляет функцию getDOMImplementation(). DOM Level 3 добавляет спецификацию Load/Store, которая определяет интерфейс к средству чтения, но она пока недоступна в стандартной библиотеке Python.

После получения объекта DOM-документа можно получить доступ к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM; данная часть справочного руководства описывает интерпретацию спецификации в Python.

Спецификация, предоставленная W3C, определяет DOM API для Java, ECMAScript и OMG IDL. Представленное здесь отображение на Python в значительной степени основано на IDL-версии спецификации, однако строгое соответствие не требуется (хотя реализации могут поддерживать строгое отображение из IDL). См. раздел Соответствие для подробного обсуждения требований к отображению.

См. также

Спецификация объектной модели документа (DOM) уровня 2
Рекомендация W3C, на которой основан Python DOM API.
Спецификация объектной модели документа (DOM) уровня 1
Рекомендация W3C для DOM, поддерживаемая xml.dom.minidom.
Спецификация отображения языка Python
Она определяет отображение из OMG IDL на Python.

20.6.1. Содержимое модуляModule Contents

Модуль xml.dom содержит следующие функции:

xml.dom.registerDOMImplementation(name, factory)

Регистрирует функцию factory под именем name. Функция factory должна возвращать объект, реализующий интерфейс DOMImplementation интерфейс. Функция factory может возвращать один и тот же объект каждый раз или новый при каждом вызове – в зависимости от конкретной реализации (например, если эта реализация поддерживает какие-либо настройки).

xml.dom.getDOMImplementation(name=None, features=())

Возвращает подходящую реализацию DOM. Параметр name может быть известным именем, именем модуля реализации DOM или None. Если он не равен None, импортируется соответствующий модуль и возвращается объект DOMImplementation в случае успешного импорта. Если имя не задано и установлена переменная окружения PYTHON_DOM, то для поиска реализации используется эта переменная.

Если имя не задано, то выполняется поиск среди доступных реализаций такой, которая имеет требуемый набор возможностей. Если подходящую реализацию найти не удаётся, возбуждается исключение ImportError. Список features должен быть последовательностью пар (feature, version), которые передаются методу hasFeature() для доступных объектов DOMImplementation.

Также предоставляются некоторые вспомогательные константы:

xml.dom.EMPTY_NAMESPACE

Значение, используемое для указания того, что с узлом в DOM не связан ни один namespace в DOM. Обычно оно встречается как атрибут namespaceURI узла или используется как параметр namespaceURI в методах, работающих с пространствами имён.

xml.dom.XML_NAMESPACE

URI пространства имён, связанный с зарезервированным префиксом xml, как определено Namespaces in XML (раздел 4).

xml.dom.XMLNS_NAMESPACE

URI пространства имен для объявлений пространств имен, как определено в спецификации Объектной модели документа (DOM) уровня 2, базовая часть (раздел 1.1.8).

xml.dom.XHTML_NAMESPACE

URI пространства имен XHTML, как определено в спецификации XHTML 1.0: Расширяемый язык гипертекстовой разметки (раздел 3.1.1).

Кроме того, модуль xml.dom содержит базовый класс Node и классы исключений DOM. Класс Node, предоставляемый этим модулем, не реализует ни один из методов или атрибутов, определённых спецификацией DOM; это должны делать конкретные реализации DOM. Класс Node, поставляемый в составе этого модуля, предоставляет константы, используемые для атрибута nodeType в конкретных объектах Node; они находятся внутри класса, а не на уровне модуля, чтобы соответствовать спецификациям DOM.

20.6.2. Объекты в DOMObjects in the DOM

Исчерпывающая документация по DOM – это спецификация DOM от W3C.

Обратите внимание, что атрибуты DOM также могут обрабатываться как узлы, а не как простые строки. Однако это требуется довольно редко, поэтому данное использование ещё не задокументировано.

Интерфейс Раздел Назначение
DOMImplementation Объекты DOMImplementation Интерфейс для доступа к базовой реализации.
Node Объекты Node Базовый интерфейс для большинства объектов в документе.
NodeList Объекты NodeList Интерфейс для последовательности узлов.
DocumentType Объекты DocumentType Информация об объявлениях, необходимых для обработки документа.
Document Объекты Document Объект, представляющий весь документ.
Element Объекты Element Узлы элементов в иерархии документа.
Attr Объекты Attr Узлы значений атрибутов на узлах элементов.
Комментарий Объекты Comment Представление комментариев в исходном документе.
Text Объекты Text и CDATASection Узлы, содержащие текстовое содержимое документа.
ProcessingInstruction Объекты ProcessingInstruction Представление инструкций по обработке.

Дополнительный раздел описывает исключения, определённые для работы с DOM в Python.

20.6.2.1. Объекты DOMImplementationDOMImplementation Objects

Интерфейс DOMImplementation предоставляет приложениям способ определять доступность конкретных возможностей в используемой ими реализации DOM. DOM Level 2 также добавил возможность создавать новые объекты Document и DocumentType с помощью DOMImplementation.

DOMImplementation.hasFeature(feature, version)

Возвращает True, если возможность, заданная парой строк feature и version, реализована.

DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)

Возвращает новый объект Document (корень DOM), с дочерним объектом Element, имеющим указанные namespaceUri и qualifiedName. Параметр doctype должен быть объектом DocumentType, созданным с помощью createDocumentType(), или None. В Python DOM API первые два аргумента также могут быть None, чтобы указать, что дочерний Element создавать не нужно.

DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)

Возвращает новый объект DocumentType, который инкапсулирует заданные строки qualifiedName, publicId и systemId, представляющие информацию, содержащуюся в объявлении типа документа XML.

20.6.2.2. Объекты NodeNode Objects

Все компоненты XML-документа являются подклассами Node.

Node.nodeType

Целое число, представляющее тип узла. Символические константы типов находятся в объекте Node: ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, ENTITY_NODE, PROCESSING_INSTRUCTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE. Это атрибут только для чтения.

Node.parentNode

Родитель текущего узла или None для узла документа. Значение всегда является объектом Node или None. Для узлов Element это будет родительский элемент, кроме корневого элемента, в этом случае это будет объект Document. Для узлов Attr это всегда None. Это атрибут только для чтения.

Node.attributes

Объект NamedNodeMap, содержащий атрибуты. Только элементы имеют фактические значения этого атрибута; остальные возвращают None для него. Это атрибут только для чтения.

Node.previousSibling

Узел, непосредственно предшествующий данному и имеющий того же родителя. Например, элемент с закрывающим тегом, который идёт сразу перед открывающим тегом элемента self. Разумеется, XML-документы состоят не только из элементов, поэтому предыдущим соседом может быть текст, комментарий или что-то ещё. Если данный узел является первым потомком родителя, этот атрибут будет равен None. Это атрибут только для чтения.

Node.nextSibling

Узел, непосредственно следующий за данным и имеющий того же родителя. Смотрите также previousSibling. Если это последний потомок родителя, атрибут будет равен None. Это атрибут только для чтения.

Node.childNodes

Список узлов, содержащихся в данном узле. Это атрибут только для чтения.

Node.firstChild

Первый потомок узла, если он есть, или None. Это атрибут только для чтения.

Node.lastChild

Последний потомок узла, если он есть, или None. Это атрибут только для чтения.

Node.localName

Часть tagName после двоеточия, если оно есть, иначе весь tagName. Значение – строка.

Node.prefix

Часть tagName перед двоеточием, если оно есть, иначе пустая строка. Значение – строка или None.

Node.namespaceURI

Пространство имён, связанное с именем элемента. Это будет строка или None. Это атрибут только для чтения.

Node.nodeName

Значение этого атрибута различается для каждого типа узла; подробности см. в спецификации DOM. Эту же информацию можно получить из другого свойства, например tagName для элементов или name для атрибутов. Для всех типов узлов значение этого атрибута – строка или None. Это атрибут только для чтения.

Node.nodeValue

Значение различается для каждого типа узла; см. спецификацию DOM. Ситуация аналогична nodeName. Значение – строка или None.

Node.hasAttributes()

Возвращает True, если у узла есть атрибуты.

Node.hasChildNodes()

Возвращает True, если у узла есть дочерние узлы.

Node.isSameNode(other)

Возвращает True, если other ссылается на тот же узел, что и данный узел. Это особенно полезно для реализаций DOM, использующих какую-либо прокси-архитектуру (поскольку несколько объектов могут ссылаться на один и тот же узел).

Примечание

Это основано на предложенном API DOM Level 3, который всё ещё находится на стадии «рабочего черновика», но данный конкретный интерфейс выглядит не вызывающим споров. Изменения со стороны W3C не обязательно повлияют на этот метод в Python DOM интерфейсе (хотя любые новые API W3C для этого также будут поддерживаться).

Node.appendChild(newChild)

Добавляет новый дочерний узел в конец списка дочерних узлов данного узла, возвращая newChild. Если узел уже находился в дереве, он сначала удаляется.

Node.insertBefore(newChild, refChild)

Вставляет новый дочерний узел перед существующим потомком. Необходимо, чтобы refChild был потомком этого узла; в противном случае возбуждается ValueError. Возвращается newChild. Если refChild равен None, вставляет newChild в конец списка потомков.

Node.removeChild(oldChild)

Удаляет дочерний узел. oldChild должен быть дочерним узлом данного узла; в противном случае возбуждается ValueError. В случае успеха возвращается oldChild. Если oldChild в дальнейшем не используется, следует вызвать его метод unlink().

Node.replaceChild(newChild, oldChild)

Заменяет существующий узел новым. Необходимо, чтобы oldChild был дочерним узлом данного узла; в противном случае возбуждается ValueError.

Node.normalize()

Объединяет смежные текстовые узлы так, чтобы все последовательности текста хранились в виде отдельных экземпляров Text. Это упрощает обработку текста из DOM-дерева для многих приложений.

Node.cloneNode(deep)

Клонирует данный узел. Установка deep означает клонирование всех дочерних узлов. Возвращает клон.

20.6.2.3. Объекты NodeListNodeList Objects

Объект NodeList представляет последовательность узлов. В рекомендации DOM Core эти объекты используются двумя способами: объекты Element предоставляют такой объект в качестве списка дочерних узлов, а методы getElementsByTagName() и getElementsByTagNameNS() узла Node возвращают объекты с этим интерфейсом для представления результатов запроса.

Рекомендация DOM Level 2 определяет один метод и один атрибут для этих объектов:

NodeList.item(i)

Возвращает i-й элемент последовательности, если он существует, или None. Индекс i не может быть меньше нуля или больше или равен длине последовательности.

NodeList.length

Количество узлов в последовательности.

Кроме того, интерфейс Python DOM требует дополнительной поддержки, чтобы объекты NodeList можно было использовать как последовательности Python. Все реализации NodeList должны включать поддержку __len__() и __getitem__(); это позволяет выполнять итерацию по NodeList в операторах for и обеспечивает корректную поддержку встроенной функции len().

Если реализация DOM поддерживает изменение документа, реализация NodeList должна также поддерживать методы __setitem__() и __delitem__().

20.6.2.4. Объекты DocumentTypeDocumentType Objects

Информация о нотациях и сущностях, объявленных в документе (включая внешнее подмножество, если анализатор его использует и может предоставить информацию), доступна из объекта DocumentType. Объект DocumentType для документа доступен через атрибут doctype объекта Document; если для документа нет объявления DOCTYPE, атрибут doctype документа будет установлен в None вместо экземпляра этого интерфейса.

DocumentType является специализацией Node и добавляет следующие атрибуты:

DocumentType.publicId

Публичный идентификатор внешнего подмножества определения типа документа. Это строка или None.

DocumentType.systemId

Системный идентификатор внешнего подмножества определения типа документа. Это URI в виде строки или None.

DocumentType.internalSubset

Строка, содержащая полное внутреннее подмножество документа. Она не включает скобки, обрамляющие подмножество. Если у документа нет внутреннего подмножества, значение должно быть None.

DocumentType.name

Имя корневого элемента, указанное в объявлении DOCTYPE, если оно присутствует.

DocumentType.entities

Это NamedNodeMap, содержащий определения внешних сущностей. Для имён сущностей, определённых более одного раза, предоставляется только первое определение (остальные игнорируются, как того требует рекомендация XML). Значение может быть None, если анализатор не предоставил эту информацию или если сущности не определены.

DocumentType.notations

Это NamedNodeMap, содержащий определения нотаций. Для имён нотаций, определённых более одного раза, предоставляется только первое определение (остальные игнорируются, как того требует рекомендация XML). Значение может быть None, если анализатор не предоставил эту информацию или если нотации не определены.

20.6.2.5. Объекты DocumentDocument Objects

Объект Document представляет весь XML-документ, включая его составные элементы, атрибуты, инструкции обработки, комментарии и т. д. Помните, что он наследует свойства от Node.

Document.documentElement

Единственный корневой элемент документа.

Document.createElement(tagName)

Создаёт и возвращает новый узел-элемент. При создании элемент не вставляется в документ. Его нужно явно вставить с помощью одного из других методов, например insertBefore() или appendChild().

Document.createElementNS(namespaceURI, tagName)

Создаёт и возвращает новый элемент с пространством имён. tagName может содержать префикс. Элемент не вставляется в документ при создании. Его нужно явно вставить с помощью одного из других методов, например insertBefore() или appendChild().

Document.createTextNode(data)

Создаёт и возвращает текстовый узел, содержащий данные, переданные в качестве параметра. Как и другие методы создания, этот не вставляет узел в дерево.

Document.createComment(data)

Создаёт и возвращает узел комментария, содержащий данные, переданные в качестве параметра. Как и другие методы создания, этот не вставляет узел в дерево.

Document.createProcessingInstruction(target, data)

Создаёт и возвращает узел инструкции обработки, содержащий target и data, переданные в качестве параметров. Как и другие методы создания, этот не вставляет узел в дерево.

Document.createAttribute(name)

Создаёт и возвращает узел атрибута. Этот метод не привязывает узел атрибута к какому-либо конкретному элементу. Для использования только что созданного экземпляра атрибута необходимо вызвать setAttributeNode() у соответствующего объекта Element.

Document.createAttributeNS(namespaceURI, qualifiedName)

Создаёт и возвращает узел атрибута с пространством имён. tagName может содержать префикс. Этот метод не привязывает узел атрибута к какому-либо конкретному элементу. Для использования только что созданного экземпляра атрибута необходимо вызвать setAttributeNode() у соответствующего объекта Element.

Document.getElementsByTagName(tagName)

Ищет всех потомков (прямые дочерние элементы, дочерние элементы дочерних и т. д.) с определённым именем типа элемента.

Document.getElementsByTagNameNS(namespaceURI, localName)

Ищет всех потомков (прямые дочерние элементы, дочерние элементы дочерних и т. д.) с определённым URI пространства имён и локальным именем. Локальное имя – это часть пространства имён после префикса.

20.6.2.6. Объекты ElementElement Objects

Element является подклассом Node, поэтому наследует все атрибуты этого класса.

Element.tagName

Имя типа элемента. В документе, использующем пространства имён, может содержать двоеточия. Значение – строка.

Element.getElementsByTagName(tagName)

Аналогично соответствующему методу в классе Document.

Element.getElementsByTagNameNS(namespaceURI, localName)

Аналогично соответствующему методу в классе Document.

Element.hasAttribute(name)

Возвращает True, если у элемента есть атрибут с именем name.

Element.hasAttributeNS(namespaceURI, localName)

Возвращает true, если элемент имеет атрибут с именем namespaceURI и localName.

Element.getAttribute(name)

Возвращает значение атрибута с именем name в виде строки. Если такого атрибута нет, возвращается пустая строка, как если бы атрибут не имел значения.

Element.getAttributeNode(attrname)

Возвращает узел Attr для атрибута с именем attrname.

Element.getAttributeNS(namespaceURI, localName)

Возвращает значение атрибута с именами namespaceURI и localName в виде строки. Если такого атрибута нет, возвращается пустая строка, как если бы атрибут не имел значения.

Element.getAttributeNodeNS(namespaceURI, localName)

Возвращает значение атрибута в виде узла по заданным namespaceURI и localName.

Element.removeAttribute(name)

Удаляет атрибут по имени. Если подходящий атрибут не найден, возбуждается исключение NotFoundErr.

Element.removeAttributeNode(oldAttr)

Удаляет oldAttr из списка атрибутов, если он присутствует, и возвращает его. Если oldAttr отсутствует, возбуждается исключение NotFoundErr.

Element.removeAttributeNS(namespaceURI, localName)

Удаляет атрибут по имени. Обратите внимание, что используется localName, а не qname. Если подходящего атрибута нет, исключение не возбуждается.

Element.setAttribute(name, value)

Устанавливает значение атрибута из строки.

Element.setAttributeNode(newAttr)

Добавляет новый узел атрибута к элементу, при необходимости заменяя существующий атрибут, если совпадает имя атрибута name. В случае замены возвращается старый узел атрибута. Если newAttr уже используется, возбуждается исключение InuseAttributeErr.

Element.setAttributeNodeNS(newAttr)

Добавляет новый узел атрибута к элементу, заменяя существующий атрибут при необходимости, если атрибуты namespaceURI и localName совпадают. Если происходит замена, старый узел атрибута будет возвращён. Если newAttr уже используется, будет возбуждено InuseAttributeErr.

Element.setAttributeNS(namespaceURI, qname, value)

Устанавливает значение атрибута из строки на основе namespaceURI и qname. Обратите внимание: qname – это полное имя атрибута. Это отличается от описанного выше.

20.6.2.7. Объекты AttrAttr Objects

Attr наследует от Node, поэтому наследует все его атрибуты.

Attr.name

Имя атрибута. В документе, использующем пространства имён, оно может содержать двоеточие.

Attr.localName

Часть имени после двоеточия, если оно есть, иначе всё имя целиком. Это атрибут только для чтения.

Attr.prefix

Часть имени до двоеточия, если оно есть, иначе пустая строка.

Attr.value

Текстовое значение атрибута. Является синонимом атрибута nodeValue.

20.6.2.8. Объекты NamedNodeMapNamedNodeMap Objects

NamedNodeMap не наследует от Node.

NamedNodeMap.length

Длина списка атрибутов.

NamedNodeMap.item(index)

Возвращает атрибут с заданным индексом. Порядок получения атрибутов произволен, но будет постоянным на протяжении времени существования DOM. Каждый элемент является узлом атрибута. Получить его значение можно через атрибут value.

Существуют также экспериментальные методы, которые добавляют этому классу поведение, подобное словарю. Вы можете использовать их или стандартизированное семейство методов getAttribute*() у объектов Element.

20.6.2.9. Объекты CommentComment Objects

Comment представляет комментарий в XML-документе. Он является подклассом Node, но не может иметь дочерних узлов.

Comment.data

Содержимое комментария в виде строки. Атрибут содержит все символы между открывающим <!-- и закрывающим -->, но не включает их.

20.6.2.10. Объекты Text и CDATASectionText and CDATASection Objects

Интерфейс Text представляет текст в XML-документе. Если анализатор и реализация DOM поддерживают XML-расширение DOM, части текста, заключённые в CDATA-секции, хранятся в объектах CDATASection. Эти два интерфейса идентичны, но предоставляют разные значения для атрибута nodeType.

Эти интерфейсы расширяют интерфейс Node. Они не могут иметь дочерних узлов.

Text.data

Содержимое текстового узла в виде строки.

Примечание

Использование узла CDATASection не означает, что узел представляет полную CDATA-секцию, а лишь то, что содержимое узла было частью CDATA-секции. Одна CDATA-секция может быть представлена несколькими узлами в дереве документа. Невозможно определить, представляют ли два соседних узла CDATASection разные CDATA-секции.

20.6.2.11. Объекты ProcessingInstructionProcessingInstruction Objects

Представляет инструкцию по обработке в XML-документе; наследует от интерфейса Node и не может иметь дочерних узлов.

ProcessingInstruction.target

Содержимое инструкции по обработке до первого пробельного символа. Это атрибут только для чтения.

ProcessingInstruction.data

Содержимое инструкции по обработке, следующее за первым пробельным символом.

20.6.2.12. ИсключенияExceptions

Рекомендация DOM Level 2 определяет одно исключение, DOMException, и ряд констант, позволяющих приложениям определить тип произошедшей ошибки. Экземпляры DOMException содержат атрибут code, предоставляющий соответствующее значение для конкретного исключения.

Интерфейс DOM для Python предоставляет константы, но также расширяет набор исключений, так что для каждого кода исключения, определённого DOM, существует соответствующее конкретное исключение. Реализации должны возбуждать соответствующее конкретное исключение, каждое из которых содержит соответствующее значение для атрибута code.

exception xml.dom.DOMException

Базовый класс исключения, используемый для всех специфических исключений DOM. Этот класс исключения не может быть создан напрямую.

exception xml.dom.DomstringSizeErr

Возбуждается, когда указанный диапазон текста не помещается в строку. В реализациях DOM на Python это исключение не используется, но может быть получено от реализаций DOM, написанных не на Python.

exception xml.dom.HierarchyRequestErr

Возбуждается при попытке вставить узел туда, где тип узла не разрешён.

exception xml.dom.IndexSizeErr

Возбуждается, когда параметр индекса или размера, переданный методу, отрицателен или превышает допустимые значения.

exception xml.dom.InuseAttributeErr

Возбуждается при попытке вставить узел Attr, который уже присутствует в другом месте документа.

exception xml.dom.InvalidAccessErr

Возбуждается, если параметр или операция не поддерживается для базового объекта.

exception xml.dom.InvalidCharacterErr

Это исключение возбуждается, когда строковый параметр содержит символ, который не разрешён в данном контексте согласно рекомендации XML 1.0. Например, попытка создать узел Element с пробелом в имени типа элемента приведёт к возникновению этой ошибки.

exception xml.dom.InvalidModificationErr

Возбуждается при попытке изменить тип узла.

exception xml.dom.InvalidStateErr

Возбуждается при попытке использовать объект, который не определён или больше не пригоден к использованию.

exception xml.dom.NamespaceErr

Если предпринимается попытка изменить объект способом, не разрешённым согласно рекомендации Namespaces in XML, возбуждается это исключение.

exception xml.dom.NotFoundErr

Исключение, возникающее, когда узел не существует в указанном контексте. Например, NamedNodeMap.removeNamedItem() возбудит это исключение, если переданный узел не существует в отображении.

exception xml.dom.NotSupportedErr

Возбуждается, когда реализация не поддерживает запрошенный тип объекта или операции.

exception xml.dom.NoDataAllowedErr

Возбуждается, если данные указаны для узла, который не поддерживает данные.

exception xml.dom.NoModificationAllowedErr

Возбуждается при попытке изменить объект, в котором изменения не разрешены (например, для узлов, доступных только для чтения).

exception xml.dom.SyntaxErr

Возникает при указании недопустимой или неверной строки.

exception xml.dom.WrongDocumentErr

Возникает, когда узел вставляется в документ, отличный от того, к которому он в настоящее время принадлежит, и реализация не поддерживает перенос узла из одного документа в другой.

Коды исключений, определённые в рекомендации DOM, сопоставляются с описанными выше исключениями согласно следующей таблице:

Константа Исключение
DOMSTRING_SIZE_ERR DomstringSizeErr
HIERARCHY_REQUEST_ERR HierarchyRequestErr
INDEX_SIZE_ERR IndexSizeErr
INUSE_ATTRIBUTE_ERR InuseAttributeErr
INVALID_ACCESS_ERR InvalidAccessErr
INVALID_CHARACTER_ERR InvalidCharacterErr
INVALID_MODIFICATION_ERR InvalidModificationErr
INVALID_STATE_ERR InvalidStateErr
NAMESPACE_ERR NamespaceErr
NOT_FOUND_ERR NotFoundErr
NOT_SUPPORTED_ERR NotSupportedErr
NO_DATA_ALLOWED_ERR NoDataAllowedErr
NO_MODIFICATION_ALLOWED_ERR NoModificationAllowedErr
SYNTAX_ERR SyntaxErr
WRONG_DOCUMENT_ERR WrongDocumentErr

20.6.3. СоответствиеConformance

В этом разделе описываются требования к соответствию и взаимосвязи между Python DOM API, рекомендациями W3C DOM и отображением OMG IDL для Python.

20.6.3.1. Сопоставление типовType Mapping

Типы IDL, используемые в спецификации DOM, сопоставляются с типами Python согласно следующей таблице.

Тип IDL Тип Python
boolean bool или int
int int
long int int
unsigned int int
DOMString str или bytes
null None

20.6.3.2. Методы доступаAccessor Methods

Отображение OMG IDL на Python определяет функции доступа для объявлений attribute в IDL во многом так же, как это делает отображение Java. Отображение IDL-объявлений

readonly attribute string someValue;
         attribute string anotherValue;

возвращает три функции доступа: метод «get» для someValue (_get_someValue()), и методы «get» и «set» для anotherValue (_get_anotherValue() и _set_anotherValue()). Отображение, в частности, не требует, чтобы атрибуты IDL были доступны как обычные атрибуты Python: object.someValue не обязан работать и может возбудить AttributeError.

Однако Python DOM API действительно требует, чтобы обычный доступ к атрибутам работал. Это означает, что типичные суррогаты, генерируемые компиляторами Python IDL, вряд ли будут работать, и на стороне клиента могут потребоваться объекты-обёртки, если доступ к объектам DOM осуществляется через CORBA. Хотя это требует некоторых дополнительных соображений для клиентов CORBA DOM, разработчики, имеющие опыт использования DOM через CORBA из Python, не считают это проблемой. Атрибуты, объявленные как readonly, могут не ограничивать доступ на запись во всех реализациях DOM.

В Python DOM API функции доступа не обязательны. Если они предоставлены, они должны иметь форму, определённую отображением Python IDL, но эти методы считаются ненужными, поскольку атрибуты доступны напрямую из Python. Методы доступа «set» никогда не должны предоставляться для атрибутов readonly.

Определения IDL не полностью воплощают требования W3C DOM API, такие как понятие «живых» объектов, например, возвращаемое значение getElementsByTagName(). Python DOM API не требует от реализаций соблюдения таких требований.