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.
Зміст модуля¶
xml.dom
містить такі функції:
- 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).
Крім того, xml.dom
містить базовий клас Node
і класи винятків DOM. Клас Node
, наданий цим модулем, не реалізує жодних методів або атрибутів, визначених специфікацією DOM; конкретні реалізації DOM повинні забезпечувати їх. Клас Node
, наданий як частина цього модуля, надає константи, які використовуються для атрибута nodeType
для конкретних об’єктів Node
; вони розташовані в межах класу, а не на рівні модуля, щоб відповідати специфікаціям DOM.
Об’єкти в DOM¶
Основною документацією для DOM є специфікація DOM від W3C.
Зауважте, що атрибути DOM також можна використовувати як вузли, а не як прості рядки. Однак це доводиться робити досить рідко, тому таке використання ще не задокументовано.
Інтерфейс |
Розділ |
призначення |
---|---|---|
|
Інтерфейс базової реалізації. |
|
|
Базовий інтерфейс для більшості об’єктів у документі. |
|
|
Інтерфейс для послідовності вузлів. |
|
|
Інформація про декларації, необхідні для оформлення документа. |
|
|
Об’єкт, який представляє весь документ. |
|
|
Вузли елементів в ієрархії документа. |
|
|
Вузли значення атрибута на вузлах елемента. |
|
|
Відображення коментарів у вихідному документі. |
|
|
Вузли, що містять текстовий вміст із документа. |
|
|
Представлення інструкцій обробки. |
Додатковий розділ описує винятки, визначені для роботи з 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.
Текст і об’єкти 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, відповідають описаним вище виняткам відповідно до цієї таблиці:
Постійний |
Виняток |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Відповідність¶
У цьому розділі описано вимоги до відповідності та зв’язки між Python DOM API, рекомендаціями W3C DOM і відображенням OMG IDL для Python.
Відображення типу¶
Типи IDL, які використовуються в специфікації DOM, зіставляються з типами Python відповідно до наступної таблиці.
Тип IDL |
Тип Python |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Методи доступу¶
Відображення з 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 не вимагає реалізацій для виконання таких вимог.
Об’єкти коментарів¶
Comment
представляє коментар у документі XML. Це підкласNode
, але не може мати дочірні вузли.Вміст коментаря у вигляді рядка. Атрибут містить усі символи між початковими
<!-
-
and trailing-
->
, але не включає їх.