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

xml.dom.md

1089 строк · 52.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/xml.dom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.4. `xml.dom` – API объектной модели документа89Объектная модель документа (DOM) – это независимый от языка программирования API, разработанный Консорциумом Всемирной паутины (W3C) для доступа к XML-документам и их изменения. Реализация DOM представляет XML-документ в виде древовидной структуры или позволяет клиентскому коду создать такую структуру с нуля. Затем она предоставляет доступ к структуре через набор объектов, которые предоставляют хорошо известные интерфейсы.1011DOM чрезвычайно полезен для приложений с произвольным доступом. SAX позволяет видеть только один фрагмент документа за раз. Если рассматривается один элемент SAX, доступ к другому отсутствует. Если рассматривается текстовый узел, отсутствует доступ к содержащему его элементу. При написании приложения SAX необходимо отслеживать положение программы в документе в собственном коде – SAX не делает этого автоматически. Кроме того, если требуется заглянуть вперед в XML-документе, это просто невозможно.1213Некоторые приложения просто невозможны в событийно-ориентированной модели без доступа к дереву. Конечно, можно построить некоторое подобие дерева самостоятельно, обрабатывая события SAX, но DOM позволяет избежать написания такого кода. DOM – это стандартное древовидное представление XML-данных.1415Объектная модель документа (DOM) определяется W3C поэтапно, или, в их терминологии, по «уровням». Представление API в Python в значительной степени основано на рекомендации DOM уровня 2.1617Приложения DOM обычно начинают с разбора XML в DOM. Как это делается, вообще не рассматривается в DOM Level 1, а Level 2 даёт лишь ограниченные улучшения: существует класс объектов `DOMImplementation`, который предоставляет доступ к методам создания `Document`, но нет способа получить средство чтения/парсер/построитель Document независимым от реализации образом. Также нет чёткого способа получить доступ к этим методам без существующего объекта `Document`. В Python каждая реализация DOM предоставляет функцию [`getDOMImplementation()`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.getDOMImplementation). DOM Level 3 добавляет спецификацию Load/Store, которая определяет интерфейс к средству чтения, но она пока недоступна в стандартной библиотеке Python.1819После получения объекта DOM-документа можно получить доступ к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM; данная часть справочного руководства описывает интерпретацию спецификации в Python.2021Спецификация, предоставленная W3C, определяет DOM API для Java, ECMAScript и OMG IDL. Представленное здесь отображение на Python в значительной степени основано на IDL-версии спецификации, однако строгое соответствие не требуется (хотя реализации могут поддерживать строгое отображение из IDL). См. раздел [*Соответствие*](https://python-all.ru/3.1/library/xml.dom.html#dom-conformance) для подробного обсуждения требований к отображению.2223> **См. также**24>25> **[Спецификация объектной модели документа (DOM) уровня 2](https://python-all.ru/3.1/library/xml.dom.html)**26>27> Рекомендация W3C, на которой основан Python DOM API.28>29> **[Спецификация объектной модели документа (DOM) уровня 1](https://python-all.ru/3.1/library/xml.dom.html)**30>31> Рекомендация W3C для DOM, поддерживаемая32>33> [`xml.dom.minidom`](https://python-all.ru/3.1/library/xml.dom.minidom.html#module-xml.dom.minidom)34>35> .36>37> **[Спецификация отображения языка Python](https://python-all.ru/3.1/library/xml.dom.html)**38>39> Она определяет отображение из OMG IDL на Python.4041## 19.4.1. Содержимое модуля4243Модуль `xml.dom` содержит следующие функции:4445#### `xml.dom.registerDOMImplementation(name, factory)`4647Регистрирует функцию4849*factory*5051под именем5253*name*5455. Функция factory должна возвращать объект, реализующий интерфейс5657`DOMImplementation`5859интерфейс. Функция factory может возвращать один и тот же объект каждый раз или новый при каждом вызове – в зависимости от конкретной реализации (например, если эта реализация поддерживает какие-либо настройки).6061#### `xml.dom.getDOMImplementation(name=None, features=())`6263Возвращает подходящую реализацию DOM. Параметр *name* может быть известным именем, именем модуля реализации DOM или `None`. Если он не равен `None`, импортируется соответствующий модуль и возвращается объект `DOMImplementation`, если импорт удался. Если имя не указано и установлена переменная окружения **PYTHON\_DOM**, то она используется для поиска реализации.6465Если имя не задано, то выполняется поиск среди доступных реализаций такой, которая имеет требуемый набор возможностей. Если подходящую реализацию найти не удаётся, возбуждается исключение [`ImportError`](https://python-all.ru/3.1/library/exceptions.html#ImportError). Список features должен быть последовательностью пар `(feature, version)`, которые передаются методу `hasFeature()` для доступных объектов `DOMImplementation`.6667Также предоставляются некоторые вспомогательные константы:6869#### `xml.dom.EMPTY_NAMESPACE`7071Значение, используемое для указания того, что с узлом в DOM не связан ни один namespace в DOM. Обычно оно встречается как атрибут7273`namespaceURI`7475узла или используется как параметр7677*namespaceURI*7879в методах, работающих с пространствами имён.8081#### `xml.dom.XML_NAMESPACE`8283URI пространства имён, связанный с зарезервированным префиксом8485`xml`8687, как определено8889[Namespaces in XML](https://python-all.ru/3.1/library/xml.dom.html)9091(раздел 4).9293#### `xml.dom.XMLNS_NAMESPACE`9495URI пространства имен для объявлений пространств имен, как определено в спецификации9697[Объектной модели документа (DOM) уровня 2, базовая часть](https://python-all.ru/3.1/library/xml.dom.html)9899(раздел 1.1.8).100101#### `xml.dom.XHTML_NAMESPACE`102103URI пространства имен XHTML, как определено в спецификации104105[XHTML 1.0: Расширяемый язык гипертекстовой разметки](https://python-all.ru/3.1/library/xml.dom.html)106107(раздел 3.1.1).108109Кроме того, модуль `xml.dom` содержит базовый класс `Node` и классы исключений DOM. Класс `Node`, предоставляемый этим модулем, не реализует ни один из методов или атрибутов, определённых спецификацией DOM; конкретные реализации DOM должны предоставлять их. Класс `Node`, предоставляемый в составе этого модуля, содержит константы, используемые для атрибута `nodeType` в конкретных объектах `Node`; они находятся внутри класса, а не на уровне модуля, для соответствия спецификациям DOM.110111## 19.4.2. Объекты в DOM112113Исчерпывающая документация по DOM – это спецификация DOM от W3C.114115Обратите внимание, что атрибуты DOM также могут обрабатываться как узлы, а не как простые строки. Однако это требуется довольно редко, поэтому данное использование ещё не задокументировано.116117| Интерфейс | Раздел | Назначение |118| --- | --- | --- |119| `DOMImplementation` | [*Объекты DOMImplementation*](https://python-all.ru/3.1/library/xml.dom.html#dom-implementation-objects) | Интерфейс для доступа к базовой реализации. |120| `Node` | [*Объекты Node*](https://python-all.ru/3.1/library/xml.dom.html#dom-node-objects) | Базовый интерфейс для большинства объектов в документе. |121| `NodeList` | [*Объекты NodeList*](https://python-all.ru/3.1/library/xml.dom.html#dom-nodelist-objects) | Интерфейс для последовательности узлов. |122| `DocumentType` | [*Объекты DocumentType*](https://python-all.ru/3.1/library/xml.dom.html#dom-documenttype-objects) | Информация об объявлениях, необходимых для обработки документа. |123| `Document` | [*Объекты Document*](https://python-all.ru/3.1/library/xml.dom.html#dom-document-objects) | Объект, представляющий весь документ. |124| `Element` | [*Объекты Element*](https://python-all.ru/3.1/library/xml.dom.html#dom-element-objects) | Узлы элементов в иерархии документа. |125| `Attr` | [*Объекты Attr*](https://python-all.ru/3.1/library/xml.dom.html#dom-attr-objects) | Узлы значений атрибутов на узлах элементов. |126| `Комментарий` | [*Объекты Comment*](https://python-all.ru/3.1/library/xml.dom.html#dom-comment-objects) | Представление комментариев в исходном документе. |127| `Text` | [*Объекты Text и CDATASection*](https://python-all.ru/3.1/library/xml.dom.html#dom-text-objects) | Узлы, содержащие текстовое содержимое документа. |128| `ProcessingInstruction` | [*Объекты ProcessingInstruction*](https://python-all.ru/3.1/library/xml.dom.html#dom-pi-objects) | Представление инструкций по обработке. |129130Дополнительный раздел описывает исключения, определённые для работы с DOM в Python.131132### 19.4.2.1. Объекты DOMImplementation133134Интерфейс `DOMImplementation` предоставляет приложениям способ определять доступность конкретных возможностей в используемой ими реализации DOM. DOM Level 2 также добавил возможность создавать новые объекты `Document` и `DocumentType` с помощью `DOMImplementation`.135136#### `DOMImplementation.hasFeature(feature, version)`137138Возвращает True, если возможность, заданная парой строк139140*feature*141142и143144*version*145146, реализована.147148#### `DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)`149150Возвращает новый объект151152`Document`153154(корень DOM), с дочерним объектом155156`Element`157158, имеющим указанные159160*namespaceUri*161162и163164*qualifiedName*165166. Параметр167168*doctype*169170должен быть объектом171172`DocumentType`173174, созданным с помощью175176[`createDocumentType()`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.DOMImplementation.createDocumentType)177178, или179180`None`181182. В Python DOM API первые два аргумента также могут быть183184`None`185186, чтобы указать, что дочерний187188`Element`189190создавать не нужно.191192#### `DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)`193194Возвращает новый объект195196`DocumentType`197198, который инкапсулирует заданные строки199200*qualifiedName*201202,203204*publicId*205206и207208*systemId*209210, представляющие информацию, содержащуюся в объявлении типа документа XML.211212### 19.4.2.2. Объекты Node213214Все компоненты XML-документа являются подклассами `Node`.215216#### `Node.nodeType`217218Целое число, представляющее тип узла. Символические константы типов находятся в объекте219220`Node`221222:223224`ELEMENT_NODE`225226,227228`ATTRIBUTE_NODE`229230,231232`TEXT_NODE`233234,235236`CDATA_SECTION_NODE`237238,239240`ENTITY_NODE`241242,243244`PROCESSING_INSTRUCTION_NODE`245246,247248`COMMENT_NODE`249250,251252`DOCUMENT_NODE`253254,255256`DOCUMENT_TYPE_NODE`257258,259260`NOTATION_NODE`261262. Это атрибут только для чтения.263264#### `Node.parentNode`265266Родитель текущего узла или267268`None`269270для узла документа. Значение всегда является объектом271272`Node`273274или275276`None`277278. Для узлов279280`Element`281282это будет родительский элемент, кроме корневого элемента, в этом случае это будет объект283284`Document`285286. Для узлов287288`Attr`289290это всегда291292`None`293294. Это атрибут только для чтения.295296#### `Node.attributes`297298Объект299300`NamedNodeMap`301302, содержащий атрибуты. Только элементы имеют фактические значения этого атрибута; остальные возвращают303304`None`305306для него. Это атрибут только для чтения.307308#### `Node.previousSibling`309310Узел, непосредственно предшествующий данному и имеющий того же родителя. Например, элемент с закрывающим тегом, который идёт сразу перед открывающим тегом элемента311312*self*313314. Разумеется, XML-документы состоят не только из элементов, поэтому предыдущим соседом может быть текст, комментарий или что-то ещё. Если данный узел является первым потомком родителя, этот атрибут будет равен315316`None`317318. Это атрибут только для чтения.319320#### `Node.nextSibling`321322Узел, непосредственно следующий за данным и имеющий того же родителя. Смотрите также323324[`previousSibling`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.Node.previousSibling)325326. Если это последний потомок родителя, атрибут будет равен327328`None`329330. Это атрибут только для чтения.331332#### `Node.childNodes`333334Список узлов, содержащихся в данном узле. Это атрибут только для чтения.335336#### `Node.firstChild`337338Первый потомок узла, если он есть, или339340`None`341342. Это атрибут только для чтения.343344#### `Node.lastChild`345346Последний потомок узла, если он есть, или347348`None`349350. Это атрибут только для чтения.351352#### `Node.localName`353354Часть355356`tagName`357358после двоеточия, если оно есть, иначе весь359360`tagName`361362. Значение – строка.363364#### `Node.prefix`365366Часть367368`tagName`369370, предшествующая двоеточию, если оно есть, иначе пустая строка. Значение – строка или371372`None`373374.375376#### `Node.namespaceURI`377378Пространство имён, связанное с именем элемента. Это будет строка или379380`None`381382. Это атрибут только для чтения.383384#### `Node.nodeName`385386Значение этого атрибута различается для каждого типа узла; подробности см. в спецификации DOM. Эту же информацию можно получить из другого свойства, например387388`tagName`389390для элементов или391392`name`393394для атрибутов. Для всех типов узлов значение этого атрибута – строка или395396`None`397398. Это атрибут только для чтения.399400#### `Node.nodeValue`401402Значение различается для каждого типа узла; см. спецификацию DOM. Ситуация аналогична403404[`nodeName`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.Node.nodeName)405406. Значение – строка или407408`None`409410.411412#### `Node.hasAttributes()`413414Возвращает True, если у узла есть атрибуты.415416#### `Node.hasChildNodes()`417418Возвращает True, если у узла есть дочерние узлы.419420#### `Node.isSameNode(other)`421422Возвращает True, если *other* ссылается на тот же узел, что и данный узел. Это особенно полезно для реализаций DOM, использующих какую-либо прокси-архитектуру (поскольку несколько объектов могут ссылаться на один и тот же узел).423424> **Примечание**425>426> Это основано на предложенном API DOM Level 3, который всё ещё находится на стадии «рабочего черновика», но данный конкретный интерфейс выглядит не вызывающим споров. Изменения со стороны W3C не обязательно повлияют на этот метод в Python DOM интерфейсе (хотя любые новые API W3C для этого также будут поддерживаться).427428#### `Node.appendChild(newChild)`429430Добавляет новый дочерний узел к этому узлу в конец списка дочерних узлов, возвращая431432*newChild*433434. Если узел уже находится в дереве, он сначала удаляется.435436#### `Node.insertBefore(newChild, refChild)`437438Вставляет новый дочерний узел перед существующим потомком. Необходимо, чтобы439440*refChild*441442был потомком этого узла; в противном случае возбуждается443444[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)445446. Возвращается447448*newChild*449450. Если451452*refChild*453454равен455456`None`457458, вставляет459460*newChild*461462в конец списка потомков.463464#### `Node.removeChild(oldChild)`465466Удаляет дочерний узел.467468*oldChild*469470должен быть дочерним узлом данного узла; в противном случае возбуждается471472[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)473474. В случае успеха возвращается475476*oldChild*477478. Если479480*oldChild*481482в дальнейшем не используется, следует вызвать его метод483484`unlink()`485486.487488#### `Node.replaceChild(newChild, oldChild)`489490Заменяет существующий узел новым. Необходимо, чтобы491492*oldChild*493494был дочерним узлом данного узла; в противном случае возбуждается495496[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)497498.499500#### `Node.normalize()`501502Объединяет смежные текстовые узлы так, чтобы все последовательности текста хранились в виде отдельных экземпляров503504`Text`505506. Это упрощает обработку текста из DOM-дерева для многих приложений.507508#### `Node.cloneNode(deep)`509510Клонирует данный узел. Установка511512*deep*513514означает клонирование всех дочерних узлов. Возвращает клон.515516### 19.4.2.3. Объекты NodeList517518Объект `NodeList` представляет последовательность узлов. В рекомендации DOM Core эти объекты используются двумя способами: объекты `Element` предоставляют такой объект в качестве списка дочерних узлов, а методы `getElementsByTagName()` и `getElementsByTagNameNS()` узла `Node` возвращают объекты с этим интерфейсом для представления результатов запроса.519520Рекомендация DOM Level 2 определяет один метод и один атрибут для этих объектов:521522#### `NodeList.item(i)`523524Возвращает525526*i-й*527528элемент из последовательности, если он существует, или529530`None`531532. Индекс533534*i*535536не может быть меньше нуля или больше либо равен длине последовательности.537538#### `NodeList.length`539540Количество узлов в последовательности.541542Кроме того, интерфейс DOM Python требует дополнительной поддержки, чтобы объекты `NodeList` можно было использовать как последовательности Python. Все реализации `NodeList` должны поддерживать методы [`__len__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__len__) и [`__getitem__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__getitem__); это позволяет выполнять итерацию по `NodeList` в операторах [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for) и корректно использовать встроенную функцию [`len()`](https://python-all.ru/3.1/library/functions.html#len).543544Если реализация DOM поддерживает изменение документа, реализация `NodeList` также должна поддерживать методы [`__setitem__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__setitem__) и [`__delitem__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__delitem__).545546### 19.4.2.4. Объекты DocumentType547548Информация о нотациях и сущностях, объявленных в документе (включая внешнее подмножество, если анализатор его использует и может предоставить информацию), доступна из объекта `DocumentType`. Объект `DocumentType` для документа доступен через атрибут `doctype` объекта `Document`; если для документа нет объявления `DOCTYPE`, атрибут `doctype` документа будет установлен в `None` вместо экземпляра этого интерфейса.549550`DocumentType` является специализацией `Node` и добавляет следующие атрибуты:551552#### `DocumentType.publicId`553554Публичный идентификатор внешнего подмножества определения типа документа. Это строка или555556`None`557558.559560#### `DocumentType.systemId`561562Системный идентификатор внешнего подмножества определения типа документа. Это URI в виде строки или563564`None`565566.567568#### `DocumentType.internalSubset`569570Строка, содержащая полное внутреннее подмножество документа. Она не включает скобки, обрамляющие подмножество. Если у документа нет внутреннего подмножества, значение должно быть571572`None`573574.575576#### `DocumentType.name`577578Имя корневого элемента, указанное в объявлении579580`DOCTYPE`581582, если оно присутствует.583584#### `DocumentType.entities`585586Это587588`NamedNodeMap`589590, содержащий определения внешних сущностей. Для имён сущностей, определённых более одного раза, предоставляется только первое определение (остальные игнорируются, как того требует рекомендация XML). Значение может быть591592`None`593594, если анализатор не предоставил эту информацию или если сущности не определены.595596#### `DocumentType.notations`597598Это599600`NamedNodeMap`601602, содержащий определения нотаций. Для имён нотаций, определённых более одного раза, предоставляется только первое определение (остальные игнорируются, как того требует рекомендация XML). Значение может быть603604`None`605606, если анализатор не предоставил эту информацию или если нотации не определены.607608### 19.4.2.5. Объекты Document609610Объект `Document` представляет весь XML-документ, включая его составные элементы, атрибуты, инструкции обработки, комментарии и т. д. Помните, что он наследует свойства от `Node`.611612#### `Document.documentElement`613614Единственный корневой элемент документа.615616#### `Document.createElement(tagName)`617618Создаёт и возвращает новый узел-элемент. При создании элемент не вставляется в документ. Его нужно явно вставить с помощью одного из других методов, например619620`insertBefore()`621622или623624`appendChild()`625626.627628#### `Document.createElementNS(namespaceURI, tagName)`629630Создаёт и возвращает новый элемент с пространством имён.631632*tagName*633634может содержать префикс. Элемент не вставляется в документ при создании. Его нужно явно вставить с помощью одного из других методов, например635636`insertBefore()`637638или639640`appendChild()`641642.643644#### `Document.createTextNode(data)`645646Создаёт и возвращает текстовый узел, содержащий данные, переданные в качестве параметра. Как и другие методы создания, этот не вставляет узел в дерево.647648#### `Document.createComment(data)`649650Создаёт и возвращает узел комментария, содержащий данные, переданные в качестве параметра. Как и другие методы создания, этот не вставляет узел в дерево.651652#### `Document.createProcessingInstruction(target, data)`653654Создаёт и возвращает узел инструкции обработки, содержащий655656*target*657658и659660*data*661662, переданные в качестве параметров. Как и другие методы создания, этот не вставляет узел в дерево.663664#### `Document.createAttribute(name)`665666Создаёт и возвращает узел атрибута. Этот метод не привязывает узел атрибута к какому-либо конкретному элементу. Для использования только что созданного экземпляра атрибута необходимо вызвать667668`setAttributeNode()`669670у соответствующего объекта671672`Element`673674.675676#### `Document.createAttributeNS(namespaceURI, qualifiedName)`677678Создаёт и возвращает узел атрибута с пространством имён.679680*tagName*681682может содержать префикс. Этот метод не привязывает узел атрибута к какому-либо конкретному элементу. Для использования только что созданного экземпляра атрибута необходимо вызвать683684`setAttributeNode()`685686у соответствующего объекта687688`Element`689690.691692#### `Document.getElementsByTagName(tagName)`693694Ищет всех потомков (прямые дочерние элементы, дочерние элементы дочерних и т. д.) с определённым именем типа элемента.695696#### `Document.getElementsByTagNameNS(namespaceURI, localName)`697698Ищет всех потомков (прямые дочерние элементы, дочерние элементы дочерних и т. д.) с определённым URI пространства имён и локальным именем. Локальное имя – это часть пространства имён после префикса.699700### 19.4.2.6. Объекты Element701702`Element` является подклассом `Node`, поэтому наследует все атрибуты этого класса.703704#### `Element.tagName`705706Имя типа элемента. В документе, использующем пространства имён, может содержать двоеточия. Значение – строка.707708#### `Element.getElementsByTagName(tagName)`709710Аналогично соответствующему методу в классе711712`Document`713714.715716#### `Element.getElementsByTagNameNS(namespaceURI, localName)`717718Аналогично соответствующему методу в классе719720`Document`721722.723724#### `Element.hasAttribute(name)`725726Возвращает True, если у элемента есть атрибут с именем727728*name*729730.731732#### `Element.hasAttributeNS(namespaceURI, localName)`733734Возвращает true, если элемент имеет атрибут с именем735736*namespaceURI*737738и739740*localName*741742.743744#### `Element.getAttribute(name)`745746Возвращает значение атрибута с именем747748*name*749750в виде строки. Если такого атрибута нет, возвращается пустая строка, как если бы атрибут не имел значения.751752#### `Element.getAttributeNode(attrname)`753754Возвращает узел755756`Attr`757758для атрибута с именем759760*attrname*761762.763764#### `Element.getAttributeNS(namespaceURI, localName)`765766Возвращает значение атрибута с именами767768*namespaceURI*769770и771772*localName*773774в виде строки. Если такого атрибута нет, возвращается пустая строка, как если бы атрибут не имел значения.775776#### `Element.getAttributeNodeNS(namespaceURI, localName)`777778Возвращает значение атрибута в виде узла по заданным779780*namespaceURI*781782и783784*localName*785786.787788#### `Element.removeAttribute(name)`789790Удаляет атрибут по имени. Если подходящий атрибут не найден, возбуждается исключение791792[`NotFoundErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NotFoundErr)793794.795796#### `Element.removeAttributeNode(oldAttr)`797798Удаляет799800*oldAttr*801802из списка атрибутов, если он присутствует, и возвращает его. Если803804*oldAttr*805806отсутствует, возбуждается исключение807808[`NotFoundErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NotFoundErr)809810.811812#### `Element.removeAttributeNS(namespaceURI, localName)`813814Удаляет атрибут по имени. Обратите внимание, что используется localName, а не qname. Если подходящего атрибута нет, исключение не возбуждается.815816#### `Element.setAttribute(name, value)`817818Устанавливает значение атрибута из строки.819820#### `Element.setAttributeNode(newAttr)`821822Добавляет новый узел атрибута к элементу, при необходимости заменяя существующий атрибут, если совпадает имя атрибута823824`name`825826. В случае замены возвращается старый узел атрибута. Если827828*newAttr*829830уже используется, возбуждается исключение831832[`InuseAttributeErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InuseAttributeErr)833834.835836#### `Element.setAttributeNodeNS(newAttr)`837838Добавляет новый узел атрибута к элементу, заменяя существующий атрибут при необходимости, если атрибуты839840`namespaceURI`841842и843844`localName`845846совпадают. Если происходит замена, старый узел атрибута будет возвращён. Если847848*newAttr*849850уже используется, будет возбуждено851852[`InuseAttributeErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InuseAttributeErr)853854.855856#### `Element.setAttributeNS(namespaceURI, qname, value)`857858Устанавливает значение атрибута из строки на основе859860*namespaceURI*861862и863864*qname*865866. Обратите внимание: qname – это полное имя атрибута. Это отличается от описанного выше.867868### 19.4.2.7. Объекты Attr869870`Attr` наследует от `Node`, поэтому наследует все его атрибуты.871872#### `Attr.name`873874Имя атрибута. В документе, использующем пространства имён, в нём могут встречаться двоеточия.875876#### `Attr.localName`877878Часть имени, следующая за двоеточием, если оно есть, иначе всё имя целиком. Это атрибут только для чтения.879880#### `Attr.prefix`881882Часть имени, предшествующая двоеточию, если оно есть, иначе пустая строка.883884### 19.4.2.8. Объекты NamedNodeMap885886`NamedNodeMap` *не* наследует от `Node`.887888#### `NamedNodeMap.length`889890Длина списка атрибутов.891892#### `NamedNodeMap.item(index)`893894Возвращает атрибут с заданным индексом. Порядок получения атрибутов произволен, но будет постоянным на протяжении времени существования DOM. Каждый элемент является узлом атрибута. Получить его значение можно через атрибут895896`value`897898.899900Существуют также экспериментальные методы, которые добавляют этому классу поведение, подобное словарю. Вы можете использовать их или стандартизированное семейство методов `getAttribute*()` у объектов `Element`.901902### 19.4.2.9. Объекты Comment903904`Comment` представляет комментарий в XML-документе. Он является подклассом `Node`, но не может иметь дочерних узлов.905906#### `Comment.data`907908Содержимое комментария в виде строки. Атрибут содержит все символы между открывающим909910`<!-`911912`-`913914и закрывающим915916`-`917918`->`919920, но не включает их.921922### 19.4.2.10. Объекты Text и CDATASection923924Интерфейс `Text` представляет текст в XML-документе. Если анализатор и реализация DOM поддерживают XML-расширение DOM, части текста, заключённые в CDATA-секции, хранятся в объектах `CDATASection`. Эти два интерфейса идентичны, но предоставляют разные значения для атрибута `nodeType`.925926Эти интерфейсы расширяют интерфейс `Node`. Они не могут иметь дочерних узлов.927928#### `Text.data`929930Содержимое текстового узла в виде строки.931932> **Примечание**933>934> Использование узла `CDATASection` не означает, что узел представляет полную CDATA-секцию, а лишь то, что содержимое узла было частью CDATA-секции. Одна CDATA-секция может быть представлена несколькими узлами в дереве документа. Невозможно определить, представляют ли два соседних узла `CDATASection` разные CDATA-секции.935936### 19.4.2.11. Объекты ProcessingInstruction937938Представляет инструкцию по обработке в XML-документе; наследует от интерфейса `Node` и не может иметь дочерних узлов.939940#### `ProcessingInstruction.target`941942Содержимое инструкции по обработке до первого пробельного символа. Это атрибут только для чтения.943944#### `ProcessingInstruction.data`945946Содержимое инструкции по обработке, следующее за первым пробельным символом.947948### 19.4.2.12. Исключения949950Рекомендация DOM Level 2 определяет одно исключение, [`DOMException`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.DOMException), и ряд констант, позволяющих приложениям определить, какая ошибка произошла. [`DOMException`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.DOMException) экземпляры содержат атрибут `code`, который предоставляет соответствующее значение для конкретного исключения.951952Интерфейс DOM в Python предоставляет константы, но также расширяет набор исключений, так что для каждого кода исключения, определённого в DOM, существует своё специфическое исключение. Реализации должны возбуждать соответствующее специфическое исключение, каждое из которых содержит соответствующее значение для атрибута `code`.953954#### `exception xml.dom.DOMException`955956Базовый класс исключения, используемый для всех специфических исключений DOM. Этот класс исключения не может быть создан напрямую.957958#### `exception xml.dom.DomstringSizeErr`959960Возбуждается, когда указанный диапазон текста не помещается в строку. В реализациях DOM на Python это исключение не используется, но может быть получено от реализаций DOM, написанных не на Python.961962#### `exception xml.dom.HierarchyRequestErr`963964Возбуждается при попытке вставить узел туда, где тип узла не разрешён.965966#### `exception xml.dom.IndexSizeErr`967968Возбуждается, когда параметр индекса или размера, переданный методу, отрицателен или превышает допустимые значения.969970#### `exception xml.dom.InuseAttributeErr`971972Возбуждается при попытке вставить узел973974`Attr`975976, который уже присутствует в другом месте документа.977978#### `exception xml.dom.InvalidAccessErr`979980Возбуждается, если параметр или операция не поддерживается для базового объекта.981982#### `exception xml.dom.InvalidCharacterErr`983984Это исключение возбуждается, когда строковый параметр содержит символ, который не разрешён в данном контексте согласно рекомендации XML 1.0. Например, попытка создать узел985986`Element`987988с пробелом в имени типа элемента приведёт к возникновению этой ошибки.989990#### `exception xml.dom.InvalidModificationErr`991992Возбуждается при попытке изменить тип узла.993994#### `exception xml.dom.InvalidStateErr`995996Возбуждается при попытке использовать объект, который не определён или больше не пригоден к использованию.997998#### `exception xml.dom.NamespaceErr`9991000Если предпринимается попытка изменить объект способом, не разрешённым согласно рекомендации10011002[Namespaces in XML](https://python-all.ru/3.1/library/xml.dom.html)10031004, возбуждается это исключение.10051006#### `exception xml.dom.NotFoundErr`10071008Исключение, возникающее, когда узел не существует в указанном контексте. Например,10091010`NamedNodeMap.removeNamedItem()`10111012возбудит это исключение, если переданный узел не существует в отображении.10131014#### `exception xml.dom.NotSupportedErr`10151016Возбуждается, когда реализация не поддерживает запрошенный тип объекта или операции.10171018#### `exception xml.dom.NoDataAllowedErr`10191020Возбуждается, если данные указаны для узла, который не поддерживает данные.10211022#### `exception xml.dom.NoModificationAllowedErr`10231024Возбуждается при попытке изменить объект, в котором изменения не разрешены (например, для узлов, доступных только для чтения).10251026#### `exception xml.dom.SyntaxErr`10271028Возникает при указании недопустимой или неверной строки.10291030#### `exception xml.dom.WrongDocumentErr`10311032Возникает, когда узел вставляется в документ, отличный от того, к которому он в настоящее время принадлежит, и реализация не поддерживает перенос узла из одного документа в другой.10331034Коды исключений, определённые в рекомендации DOM, сопоставляются с описанными выше исключениями согласно следующей таблице:10351036| Константа | Исключение |1037| --- | --- |1038| `DOMSTRING_SIZE_ERR` | [`DomstringSizeErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.DomstringSizeErr) |1039| `HIERARCHY_REQUEST_ERR` | [`HierarchyRequestErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.HierarchyRequestErr) |1040| `INDEX_SIZE_ERR` | [`IndexSizeErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.IndexSizeErr) |1041| `INUSE_ATTRIBUTE_ERR` | [`InuseAttributeErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InuseAttributeErr) |1042| `INVALID_ACCESS_ERR` | [`InvalidAccessErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InvalidAccessErr) |1043| `INVALID_CHARACTER_ERR` | [`InvalidCharacterErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InvalidCharacterErr) |1044| `INVALID_MODIFICATION_ERR` | [`InvalidModificationErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InvalidModificationErr) |1045| `INVALID_STATE_ERR` | [`InvalidStateErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.InvalidStateErr) |1046| `NAMESPACE_ERR` | [`NamespaceErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NamespaceErr) |1047| `NOT_FOUND_ERR` | [`NotFoundErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NotFoundErr) |1048| `NOT_SUPPORTED_ERR` | [`NotSupportedErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NotSupportedErr) |1049| `NO_DATA_ALLOWED_ERR` | [`NoDataAllowedErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NoDataAllowedErr) |1050| `NO_MODIFICATION_ALLOWED_ERR` | [`NoModificationAllowedErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.NoModificationAllowedErr) |1051| `SYNTAX_ERR` | [`SyntaxErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.SyntaxErr) |1052| `WRONG_DOCUMENT_ERR` | [`WrongDocumentErr`](https://python-all.ru/3.1/library/xml.dom.html#xml.dom.WrongDocumentErr) |10531054## 19.4.3. Соответствие10551056В этом разделе описываются требования к соответствию и взаимосвязи между Python DOM API, рекомендациями W3C DOM и отображением OMG IDL для Python.10571058### 19.4.3.1. Сопоставление типов10591060Примитивные типы IDL, используемые в спецификации DOM, сопоставляются с типами Python согласно следующей таблице.10611062| Тип IDL | Тип Python |1063| --- | --- |1064| `логическое значение` | `IntegerType` (со значением `0` или `1`) |1065| `int` | `IntegerType` |1066| `long int` | `IntegerType` |1067| `unsigned int` | `IntegerType` |10681069Кроме того, тип `DOMString`, определённый в рекомендации, отображается на объект bytes или str. Приложения должны уметь обрабатывать Unicode при любом возврате строки из DOM.10701071Значение IDL `null` отображается на `None`, которое может приниматься или предоставляться реализацией, когда API допускает `null`.10721073### 19.4.3.2. Методы доступа10741075Отображение OMG IDL на Python определяет функции доступа для объявлений `attribute` в IDL во многом так же, как это делает отображение Java. Отображение IDL-объявлений10761077```python1078readonly attribute string someValue;1079         attribute string anotherValue;1080```10811082возвращает три функции доступа: метод «get» для `someValue` (`_get_someValue()`), и методы «get» и «set» для `anotherValue` (`_get_anotherValue()` и `_set_anotherValue()`). Отображение, в частности, не требует, чтобы атрибуты IDL были доступны как обычные атрибуты Python: `object.someValue` *не* обязан работать и может возбудить [`AttributeError`](https://python-all.ru/3.1/library/exceptions.html#AttributeError).10831084Однако Python DOM API *действительно* требует, чтобы обычный доступ к атрибутам работал. Это означает, что типичные суррогаты, генерируемые компиляторами Python IDL, вряд ли будут работать, и на стороне клиента могут потребоваться объекты-обёртки, если доступ к объектам DOM осуществляется через CORBA. Хотя это требует некоторых дополнительных соображений для клиентов CORBA DOM, разработчики, имеющие опыт использования DOM через CORBA из Python, не считают это проблемой. Атрибуты, объявленные как `readonly`, могут не ограничивать доступ на запись во всех реализациях DOM.10851086В Python DOM API функции доступа не обязательны. Если они предоставлены, они должны иметь форму, определённую отображением Python IDL, но эти методы считаются ненужными, поскольку атрибуты доступны напрямую из Python. Методы доступа «set» никогда не должны предоставляться для атрибутов `readonly`.10871088Определения IDL не полностью воплощают требования W3C DOM API, такие как понятие «живых» объектов, например, возвращаемое значение `getElementsByTagName()`. Python DOM API не требует от реализаций соблюдения таких требований.1089