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


Объектная модель документа, или «DOM», представляет собой межъязыковой API от консорциума World Wide Web (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). См. раздел Соответствие для подробного обсуждения требований к отображению.

См.также

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

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

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

xml.dom.registerDOMImplementation(name, factory)

Регистрирует функцию 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, как определено в Пространстве имён 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.

Объекты в DOM

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

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

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

Node объекты

Все компоненты 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 уровня 3, который все ещё находится в стадии «рабочего проекта», но данный интерфейс не вызывает споров. Изменения от W3C не обязательно повлияют на данный метод в интерфейсе DOM Python (хотя любой новый 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 уровня 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. 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, если информация не предоставлена парсером или если не определены никакие обозначения.

Объекты Document

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 пространства имён и локальным именем. Локальное имя — это часть пространства имён после префикса.

Объекты Element

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

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

Comment.data

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

Объекты Text и CDATASection

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

Данные интерфейсы расширяют интерфейс Node. У них не может быть дочерних узлов.

Text.data

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

Примечание

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

Объекты ProcessingInstruction

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

ProcessingInstruction.target

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

ProcessingInstruction.data

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

Исключения

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

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

exception xml.dom.DOMException

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

exception xml.dom.DomstringSizeErr

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

Если предпринимается попытка изменить какой-либо объект способом, не разрешенным в соответствии с рекомендацией Пространства имён в 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

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

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

Отображение типов

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

IDL тип Python тип
boolean bool or int
int int
long int int
unsigned int int
DOMString str or 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 не требует реализаций для обеспечения соблюдения таких требований.