xml.dom — API объектной модели документа

Источник: Lib/xml/dom/__init__.py


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

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

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

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

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

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

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

См.также

Document Object Model (DOM) Level 2 Specification

Рекомендация W3C, на которой основан Python DOM API.

Document Object Model (DOM) Level 1 Specification

Рекомендация W3C для DOM, поддерживаемая xml.dom.minidom.

Python Language Mapping Specification

Это определяет отображение из OMG IDL в Python.

Содержание модуля

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

xml.dom.registerDOMImplementation(name, factory)

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

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

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

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

Также предусмотрены некоторые удобные константы:

xml.dom.EMPTY_NAMESPACE

Значение, используемое для указания того, что с узлом в DOM не связано ни одно пространство имен. Обычно это значение указывается как namespaceURI узла или используется в качестве параметра namespaceURI метода, специфичного для пространств имен.

xml.dom.XML_NAMESPACE

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

xml.dom.XMLNS_NAMESPACE

URI пространства имен для объявлений пространств имен, как определено в Document Object Model (DOM) Level 2 Core Specification (раздел 1.1.8).

xml.dom.XHTML_NAMESPACE

URI пространства имен XHTML, как определено в XHTML 1.0: The Extensible HyperText Markup Language (раздел 3.1.1).

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

Объекты в DOM

Окончательной документацией по DOM является спецификация DOM от W3C.

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

Интерфейс

Раздел

Назначение

DOMImplementation

Объекты DOMImplementation

Интерфейс для базовой реализации.

Node

Объекты узла

Базовый интерфейс для большинства объектов в документе.

NodeList

Объекты NodeList

Интерфейс для последовательности узлов.

DocumentType

Объекты типа документа

Информация о декларациях, необходимых для обработки документа.

Document

Объекты документов

Объект, представляющий весь документ.

Element

Объекты элементов

Узлы элементов в иерархии документов.

Attr

Объекты Attr

Узлы значений атрибутов на узлах элементов.

Comment

Объекты комментариев

Представление комментариев в исходном документе.

Text

Объекты текста и CDATASection

Узлы, содержащие текстовый контент из документа.

ProcessingInstruction

ОбработкаИнструкцииОбъекты

Представление команд обработки.

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

Объекты DOMImplementation

Интерфейс 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.

Объекты узла

Все компоненты 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

Узел, который непосредственно предшествует данному с тем же родителем. Например, элемент с тегом end, который находится непосредственно перед тегом start элемента 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, если другой ссылается на тот же узел, что и этот узел. Это особенно полезно для реализаций 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 означает, что будут клонированы и все дочерние узлы. Возвращает клон.

Объекты NodeList

Объект 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__().

Объекты типа документа

Информация о нотациях и сущностях, объявленных в документе (включая внешнее подмножество, если синтаксический анализатор использует его и может предоставить информацию), доступна из объекта DocumentType. Атрибут DocumentType для документа доступен из атрибута Document объекта doctype; если для документа нет объявления 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, если информация не предоставляется синтаксическим анализатором или если нотации не определены.

Объекты документов

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)

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

Document.createAttribute(name)

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

Document.createAttributeNS(namespaceURI, qualifiedName)

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

Document.getElementsByTagName(tagName)

Поиск всех потомков (прямых детей, детей детей и т.д.) с определенным именем типа элемента.

Document.getElementsByTagNameNS(namespaceURI, localName)

Поиск всех потомков (прямых детей, детей детей и т. д.) с определенным URI пространства имен и локальным именем. Локальное имя - это часть пространства имен после префикса.

Объекты элементов

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 - это полное имя атрибута. Это отличается от приведенного выше.

Объекты Attr

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

Attr.name

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

Attr.localName

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

Attr.prefix

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

Attr.value

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

Объекты NamedNodeMap

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

NamedNodeMap.length

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

NamedNodeMap.item(index)

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

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

Объекты комментариев

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

Comment.data

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

Объекты текста и CDATASection

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

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

Text.data

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

Примечание

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

ОбработкаИнструкцииОбъекты

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

ProcessingInstruction.target

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

ProcessingInstruction.data

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

Исключения

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

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

exception xml.dom.DOMException

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

exception xml.dom.DomstringSizeErr

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

exception xml.dom.HierarchyRequestErr

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

exception xml.dom.IndexSizeErr

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

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

Соответствие

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

Сопоставление типов

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

Тип IDL

Тип Python

boolean

bool или int

int

int

long int

int

unsigned int

int

DOMString

str или bytes

null

None

Методы доступа

Отображение из OMG IDL в Python определяет функции доступа для деклараций IDL attribute примерно так же, как это сделано в отображении 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 не требует от реализаций соблюдения таких требований.