# `xml.dom` — The Document Object Model 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 рівня 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). Перегляньте розділ Відповідність для детального обговорення вимог до відображення.

Дивись також

Специфікація рівня 2 об’єктної моделі документа (DOM)

  Рекомендація W3C, на якій базується API Python DOM.

Специфікація рівня 1 об’єктної моделі документа (DOM)

  Рекомендація W3C щодо DOM, що підтримується `xml.dom.minidom`.

Специфікація відображення мови Python

  Це визначає відображення з OMG IDL на Python.

## Зміст модуля

The `xml.dom` contains the following functions:

xml.dom.registerDOMImplementation(name, factory)

  Зареєструйте функцію factory з іменем name. Фабрична функція має повертати об’єкт, який реалізує інтерфейс `DOMImplementation`. Фабрична функція може щоразу повертати той самий об’єкт або новий для кожного виклику, залежно від конкретної реалізації (наприклад, якщо ця реалізація підтримує певні налаштування).

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

  Поверніть відповідну реалізацію DOM. Ім’я є або добре відомим, ім’ям модуля реалізації DOM, або `None`. Якщо це не `None`, імпортує відповідний модуль і повертає об’єкт `DOMImplementation`, якщо імпорт вдасться. Якщо ім’я не вказано та встановлено змінну середовища `PYTHON_DOM`, ця змінна використовується для пошуку реалізації.

  Якщо ім’я не вказано, перевіряються доступні реалізації, щоб знайти одну з потрібним набором функцій. Якщо впровадження не знайдено, викликайте `ImportError`. Список функцій має бути послідовністю пар `(функція, версія)`, які передаються в метод `hasFeature()` доступних об’єктів `DOMImplementation`.

Також надано деякі зручні константи:

xml.dom.EMPTY_NAMESPACE

  Значення, яке вказує на те, що простір імен не пов’язано з вузлом у DOM. Зазвичай це можна знайти як `namespaceURI` вузла або використовувати як параметр namespaceURI для методу, специфічного для просторів імен.

xml.dom.XML_NAMESPACE

  URI простору імен, пов’язаний із зарезервованим префіксом `xml`, як визначено Просторами імен у XML (розділ 4).

xml.dom.XMLNS_NAMESPACE

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

xml.dom.XHTML_NAMESPACE

  URI простору імен XHTML, як визначено XHTML 1.0: розширювана мова розмітки гіпертексту (розділ 3.1.1).

In addition, `xml.dom` contains a base `Node` class and the DOM exception classes. The `Node` class provided by this module does not implement any of the methods or attributes defined by the DOM specification; concrete DOM implementations must provide those. The `Node` class provided as part of this module does provide the constants used for the `nodeType` attribute on concrete `Node` objects; they are located within the class rather than at the module level to conform with the DOM specifications.

## Об’єкти в DOM

Основною документацією для DOM є специфікація DOM від W3C.

Зауважте, що атрибути DOM також можна використовувати як вузли, а не як прості рядки. Однак це доводиться робити досить рідко, тому таке використання ще не задокументовано.

Інтерфейс | Розділ | призначення
--- | --- | ---
`DOMIimplementation` | Об’єкти реалізації DOMI | Інтерфейс базової реалізації.
`Node` | Об’єкти Node | Базовий інтерфейс для більшості об’єктів у документі.
`NodeList` | Об’єкти NodeList | Інтерфейс для послідовності вузлів.
`DocumentType` | Об’єкти DocumentType | Інформація про декларації, необхідні для оформлення документа.
`Document` | Об’єкти документа | Об’єкт, який представляє весь документ.
`Element` | Об’єкти елементів | Вузли елементів в ієрархії документа.
`Attr` | Об’єкти Attr | Вузли значення атрибута на вузлах елемента.
`Comment` | Об’єкти коментарів | Відображення коментарів у вихідному документі.
`Text` | Текст і об’єкти CDATASection | Вузли, що містять текстовий вміст із документа.
`ProcessingInstruction` | Об’єкти інструкцій обробки | Представлення інструкцій обробки.

Додатковий розділ описує винятки, визначені для роботи з DOM у Python.

### Об’єкти реалізації DOMI

Інтерфейс `DOMImplementation` надає програмам спосіб визначити доступність певних функцій у DOM, який вони використовують. Рівень 2 DOM також додав можливість створювати нові об’єкти `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 рівня 3 DOM, який все ще перебуває на стадії «робочої чернетки», але цей конкретний інтерфейс не викликає суперечок. Зміни від 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 рівня 2 визначає один метод і один атрибут для цих об’єктів:

NodeList.item(i)

  Повертає i-й елемент із послідовності, якщо він є, або `None`. Індекс i не може бути меншим за нуль або більшим або дорівнювати довжині послідовності.

NodeList.length

  Кількість вузлів у послідовності.

Крім того, для інтерфейсу DOM Python потрібна додаткова підтримка, щоб об’єкти `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` представляє весь 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` є підкласом `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`.

There are also experimental methods that give this class more mapping behavior. You can use them or you can use the standardized `getAttribute*()` family of methods on the `Element` objects.

### Об’єкти коментарів

`Comment` представляє коментар у документі XML. Це підклас `Node`, але не може мати дочірні вузли.

Comment.data

  Вміст коментаря у вигляді рядка. Атрибут містить усі символи між початковими `<!-``-` and trailing `-``->`, але не включає їх.

### Текст і об’єкти 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 рівня 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
--- | ---
`логічний` | `bool` або `int`
`int` | `int`
`long int` | `int`
`unsigned int` | `int`
`DOMString` | `str` або `bytes`
`нуль` | `Жодного`

### Методи доступу

Відображення з OMG IDL на Python визначає функції доступу для оголошень `атрибутів` 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 не вважають це проблемою. Атрибути, оголошені лише для читання, можуть не обмежувати доступ для запису в усіх реалізаціях DOM.

В Python DOM API функції доступу не потрібні. Якщо вони надані, вони мають приймати форму, визначену відображенням Python IDL, але ці методи вважаються непотрібними, оскільки атрибути доступні безпосередньо з Python. Аксесори «Set» ніколи не повинні надаватися для атрибутів «лише для читання».

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