xml.dom — Die API des Document Object Model¶
Quellcode: Lib/xml/dom/__init__.py
Das Document Object Model, kurz „DOM“, ist eine sprachübergreifende API des World Wide Web Consortium (W3C), um XML-Dokumente zu lesen und zu ändern. Eine DOM-Umsetzung stellt ein XML-Dokument als Baumstruktur dar oder erlaubt es dem Code des Clients, eine solche Struktur von Grund auf aufzubauen. Den Zugriff auf die Struktur gewährt sie dann über eine Reihe von Objekten mit wohlbekannten Schnittstellen.
Für Anwendungen mit wahlfreiem Zugriff ist das DOM ausgesprochen nützlich. SAX zeigt dir immer nur einen Ausschnitt des Dokuments auf einmal. Siehst du ein SAX-Element an, hast du keinen Zugriff auf ein anderes. Siehst du einen Textknoten an, hast du keinen Zugriff auf das umgebende Element. Wer eine SAX-Anwendung schreibt, muss im eigenen Code irgendwo mitverfolgen, an welcher Stelle des Dokuments das Programm gerade steht; SAX nimmt dir das nicht ab. Und wer im XML-Dokument vorausschauen muss, hat schlicht Pech.
Manche Anwendungen sind in einem ereignisgesteuerten Modell ohne Zugriff auf einen Baum einfach nicht möglich. Natürlich könntest du in den SAX-Ereignissen selbst eine Art Baum aufbauen, doch das DOM erspart dir diesen Code. Es ist die standardisierte Baumdarstellung für XML-Daten.
Das W3C definiert das Document Object Model in Stufen, in seiner Begriffswelt „Levels“. Die Python-Abbildung der API beruht im Wesentlichen auf der Empfehlung DOM Level 2.
DOM-Anwendungen beginnen üblicherweise damit, XML in ein DOM einzulesen. Wie das geschieht, lässt DOM Level 1 völlig offen, und Level 2 bringt nur begrenzte Verbesserungen: Es gibt die Objektklasse DOMImplementation, die Zugriff auf die Methoden zum Erzeugen von Document gewährt, aber keinen Weg, unabhängig von der Umsetzung auf einen XML-Reader, -Parser oder Document-Builder zuzugreifen. Es gibt auch keinen klar festgelegten Weg, diese Methoden ohne ein vorhandenes Document-Objekt zu erreichen. In Python stellt jede DOM-Umsetzung eine Funktion getDOMImplementation() bereit. DOM Level 3 ergänzt eine Load/Store-Spezifikation, die eine Schnittstelle zum Reader festlegt. In der Python-Standardbibliothek steht sie aber noch nicht zur Verfügung.
Sobald du ein DOM-Dokumentobjekt hast, erreichst du die Teile deines XML-Dokuments über seine Eigenschaften und Methoden. Diese Eigenschaften legt die DOM-Spezifikation fest. Dieser Teil des Referenzhandbuchs beschreibt, wie die Spezifikation in Python gedeutet wird.
Die Spezifikation des W3C legt die DOM-API für Java, ECMAScript und OMG IDL fest. Die hier festgelegte Python-Abbildung beruht zum großen Teil auf der IDL-Fassung der Spezifikation, strenge Einhaltung ist aber nicht gefordert (Umsetzungen dürfen die strenge Abbildung aus IDL durchaus unterstützen). Eine ausführliche Erörterung der Anforderungen an die Abbildung steht im Abschnitt Konformität.
Siehe auch
- Document Object Model (DOM) Level 2 Specification
Die Empfehlung des W3C, auf der die Python-DOM-API beruht.
- Document Object Model (DOM) Level 1 Specification
Die Empfehlung des W3C für das DOM, das
xml.dom.minidomunterstützt.- Python Language Mapping Specification
Sie legt die Abbildung von OMG IDL auf Python fest.
Inhalt des Moduls¶
xml.dom enthält die folgenden Funktionen:
- xml.dom.registerDOMImplementation(name, factory)¶
Meldet die Factory-Funktion factory unter dem Namen name an. Die Factory-Funktion sollte ein Objekt zurückgeben, das die Schnittstelle
DOMImplementationumsetzt. Sie kann jedes Mal dasselbe Objekt oder bei jedem Aufruf ein neues zurückgeben, je nachdem, was zur jeweiligen Umsetzung passt – etwa wenn diese Umsetzung Anpassungen erlaubt.
- xml.dom.getDOMImplementation(name=None, features=())¶
Gibt eine passende DOM-Umsetzung zurück. name ist entweder ein wohlbekannter Name, der Modulname einer DOM-Umsetzung oder
None. Ist er nichtNone, wird das entsprechende Modul importiert und bei Erfolg einDOMImplementation-Objekt zurückgegeben. Ist kein Name angegeben und die UmgebungsvariablePYTHON_DOMgesetzt, dient diese Variable dazu, die Umsetzung zu finden. Der einzige wohlbekannte Name in der Standardbibliothek ist'minidom'fürxml.dom.minidom.Ist kein Name angegeben, werden die verfügbaren Umsetzungen daraufhin untersucht, welche die verlangten Merkmale mitbringt. Lässt sich keine Umsetzung finden, wird ein
ImportErrorausgelöst. Die Liste der Merkmale muss eine Sequenz von Paaren(feature, version)sein, die an die MethodehasFeature()der verfügbarenDOMImplementation-Objekte übergeben werden.
Außerdem gibt es einige praktische Konstanten:
- xml.dom.EMPTY_NAMESPACE¶
Der Wert, der angibt, dass einem Knoten im DOM kein Namensraum zugeordnet ist. Üblicherweise steht er in der
namespaceURIeines Knotens oder wird als Parameter namespaceURI an eine Methode übergeben, die mit Namensräumen arbeitet.
- xml.dom.XML_NAMESPACE¶
Die Namensraum-URI, die zum vorbehaltenen Präfix
xmlgehört, wie in Namespaces in XML (Abschnitt 4) festgelegt.
- xml.dom.XMLNS_NAMESPACE¶
Die Namensraum-URI für Namensraumdeklarationen, wie in Document Object Model (DOM) Level 2 Core Specification (Abschnitt 1.1.8) festgelegt.
- xml.dom.XHTML_NAMESPACE¶
Die URI des XHTML-Namensraums, wie in XHTML 1.0: The Extensible HyperText Markup Language (Abschnitt 3.1.1) festgelegt.
Außerdem enthält xml.dom eine Basisklasse Node und die DOM-Ausnahmeklassen. Die Node-Klasse dieses Moduls setzt keine der Methoden und Attribute um, die die DOM-Spezifikation festlegt – das müssen die konkreten DOM-Umsetzungen leisten. Die mit diesem Modul gelieferte Node-Klasse stellt aber die Konstanten für das Attribut nodeType konkreter Node-Objekte bereit. Diese liegen in der Klasse und nicht auf Modulebene, um den DOM-Spezifikationen zu entsprechen.
Objekte im DOM¶
Die maßgebliche Dokumentation des DOM ist die DOM-Spezifikation des W3C.
Die in diesem Abschnitt beschriebenen Namen sind DOM-Schnittstellen. Mit Ausnahme von Node und den Ausnahmeklassen stellt sie nicht das Modul xml.dom selbst bereit, sondern die konkreten DOM-Umsetzungen wie xml.dom.minidom.
Beachte, dass sich DOM-Attribute auch als Knoten statt als einfache Zeichenketten bearbeiten lassen. Nötig ist das allerdings recht selten, daher ist diese Verwendung noch nicht beschrieben.
Schnittstelle |
Abschnitt |
Zweck |
|---|---|---|
Schnittstelle zur zugrunde liegenden Umsetzung. |
||
Basisschnittstelle für die meisten Objekte eines Dokuments. |
||
Schnittstelle für eine Folge von Knoten. |
||
Angaben zu den Deklarationen, die zum Verarbeiten eines Dokuments nötig sind. |
||
Objekt, das ein gesamtes Dokument darstellt. |
||
Elementknoten in der Dokumenthierarchie. |
||
Knoten für Attributwerte an Elementknoten. |
||
Darstellung von Kommentaren im Quelldokument. |
||
Knoten, die Textinhalt aus dem Dokument enthalten. |
||
Darstellung einer Verarbeitungsanweisung. |
Ein weiterer Abschnitt beschreibt die Ausnahmen, die für die Arbeit mit dem DOM in Python festgelegt sind.
DOMImplementation-Objekte¶
Über die Schnittstelle DOMImplementation können Anwendungen feststellen, ob bestimmte Merkmale in dem DOM zur Verfügung stehen, das sie verwenden. Mit DOM Level 2 kam hinzu, über DOMImplementation auch neue Document- und DocumentType-Objekte zu erzeugen.
- DOMImplementation.hasFeature(feature, version)¶
Gibt
Truezurück, wenn das Merkmal umgesetzt ist, das das Zeichenkettenpaar feature und version benennt.
- DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)¶
Gibt ein neues
Document-Objekt zurück (die Wurzel des DOM) mit einemElement-Kindknoten, der namespaceUri und qualifiedName trägt. doctype muss einDocumentType-Objekt sein, dascreateDocumentType()erzeugt hat, oderNone. In der Python-DOM-API dürfen die ersten beiden Argumente auchNonesein; das bedeutet, dass keinElement-Kindknoten erzeugt werden soll.
- DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)¶
Gibt ein neues
DocumentType-Objekt zurück, das die Zeichenketten qualifiedName, publicId und systemId kapselt und damit die Angaben einer XML-Dokumenttypdeklaration darstellt.
Node-Objekte¶
Alle Bestandteile eines XML-Dokuments sind Unterklassen von Node.
Nur Knoten der folgenden Typen können Kindknoten haben, und nur Kindknoten der aufgeführten Typen:
Documenthöchstens ein
Element, höchstens einDocumentType,ProcessingInstructionundCommentDocumentFragmentundElementElement,Text,CDATASection,ProcessingInstructionundCommentAttr
Knoten anderer Typen können keine Kindknoten haben. Einen Kindknoten eines nicht erlaubten Typs einzufügen löst HierarchyRequestErr aus.
- Node.nodeType¶
Eine ganze Zahl, die den Knotentyp angibt. Symbolische Konstanten für die Typen stehen am
Node-Objekt. Dieses Attribut ist nur lesbar.
- Node.ELEMENT_NODE¶
- Node.ATTRIBUTE_NODE¶
- Node.TEXT_NODE¶
- Node.CDATA_SECTION_NODE¶
- Node.ENTITY_REFERENCE_NODE¶
- Node.ENTITY_NODE¶
- Node.PROCESSING_INSTRUCTION_NODE¶
- Node.COMMENT_NODE¶
- Node.DOCUMENT_NODE¶
- Node.DOCUMENT_TYPE_NODE¶
- Node.DOCUMENT_FRAGMENT_NODE¶
- Node.NOTATION_NODE¶
Ganzzahlige Konstanten für die möglichen Werte des Attributs
nodeType.
- Node.parentNode¶
Der Elternknoten des aktuellen Knotens oder
Nonebeim Dokumentknoten. Der Wert ist immer einNode-Objekt oderNone. BeiElement-Knoten ist es das Elternelement, außer beim Wurzelelement – dort ist es dasDocument-Objekt. BeiAttr-Knoten ist er immerNone. Dieses Attribut ist nur lesbar.
- Node.attributes¶
Eine
NamedNodeMapvon Attributobjekten. Nur Elemente haben hier tatsächliche Werte, alle anderen liefern für dieses AttributNone. Dieses Attribut ist nur lesbar.
- Node.previousSibling¶
Der Knoten, der diesem unmittelbar vorausgeht und denselben Elternknoten hat, zum Beispiel das Element, dessen End-Tag unmittelbar vor dem Start-Tag des self-Elements steht. XML-Dokumente bestehen natürlich aus mehr als nur Elementen, der vorige Geschwisterknoten kann also auch Text, ein Kommentar oder etwas anderes sein. Ist dieser Knoten der erste Kindknoten des Elternknotens, ist dieses Attribut
None. Dieses Attribut ist nur lesbar.
- Node.nextSibling¶
Der Knoten, der diesem unmittelbar folgt und denselben Elternknoten hat. Siehe auch
previousSibling. Ist dies der letzte Kindknoten des Elternknotens, ist dieses AttributNone. Dieses Attribut ist nur lesbar.
- Node.childNodes¶
Eine
NodeListder Kindknoten dieses Knotens. Hat der Knoten keine Kindknoten, ist die Liste leer. Dieses Attribut ist nur lesbar.
- Node.firstChild¶
Der erste Kindknoten des Knotens, sofern es welche gibt, sonst
None. Dieses Attribut ist nur lesbar.
- Node.lastChild¶
Der letzte Kindknoten des Knotens, sofern es welche gibt, sonst
None. Dieses Attribut ist nur lesbar.
- Node.localName¶
Der Teil des
tagNamenach dem Doppelpunkt, sofern es einen gibt, sonst der gesamtetagName. Der Wert ist eine Zeichenkette.
- Node.prefix¶
Der Teil des
tagNamevor dem Doppelpunkt, sofern es einen gibt, sonst die leere Zeichenkette. Der Wert ist eine Zeichenkette oderNone.
- Node.namespaceURI¶
Der Namensraum, der zum Elementnamen gehört. Das ist eine Zeichenkette oder
None. Dieses Attribut ist nur lesbar.
- Node.ownerDocument¶
Das
Document-Objekt, zu dem dieser Knoten gehört, oderNonebei einem Dokument selbst. Dieses Attribut ist nur lesbar.
- Node.isSupported(feature, version)¶
Gibt zurück, ob die DOM-Umsetzung ein bestimmtes feature unterstützt, wie
DOMImplementation.hasFeature().
- Node.setUserData(key, data, handler)¶
Ordnet data an diesem Knoten dem Schlüssel key zu und gibt die Daten zurück, die vorher zu key gehörten, oder
None. Ist dataNone, wird die Zuordnung aufgehoben. handler wird aufgerufen, wenn der Knoten geklont, importiert, umbenannt oder gelöscht wird. ÜbergibNone, wenn keine Benachrichtigung nötig ist.
- Node.getUserData(key)¶
Gibt die Daten zurück, die
setUserData()an diesem Knoten dem Schlüssel key zugeordnet hat, oderNone.
- Node.nodeName¶
Der Name dieses Knotens, je nach Typ – siehe die Tabelle unten. Du kannst die Angabe immer auch über eine andere Eigenschaft bekommen, etwa über
tagNamebei Elementen oder übernamebei Attributen. Dieses Attribut ist nur lesbar.
- Node.nodeValue¶
Der Wert dieses Knotens, je nach Typ – siehe die Tabelle unten. Der Wert ist eine Zeichenkette oder
None.
Die Werte von nodeName und nodeValue lauten je Knotentyp:
Knotentyp |
nodeName |
nodeValue |
|---|---|---|
|
der Inhalt |
|
|
der Inhalt |
|
|
|
|
|
|
|
|
||
|
||
der Name der Entität |
|
|
der Name der Notation |
|
|
|
der Inhalt |
- Node.hasAttributes()¶
Gibt
Truezurück, wenn der Knoten Attribute hat.
- Node.hasChildNodes()¶
Gibt
Truezurück, wenn der Knoten Kindknoten hat.
- Node.isSameNode(other)¶
Gibt
Truezurück, wenn other auf denselben Knoten verweist wie dieser Knoten. Das ist besonders bei DOM-Umsetzungen nützlich, die mit einer Proxy-Architektur arbeiten, denn dort können mehrere Objekte auf denselben Knoten verweisen.Bemerkung
Das beruht auf einer vorgeschlagenen API für DOM Level 3, die noch im Stadium „working draft“ steckt. Diese Schnittstelle scheint aber unstrittig zu sein. Änderungen des W3C müssen diese Methode in der Python-DOM-Schnittstelle nicht zwingend betreffen – eine neue W3C-API dafür würde allerdings ebenfalls unterstützt.
- Node.appendChild(newChild)¶
Fügt diesem Knoten am Ende der Liste der Kindknoten einen neuen Kindknoten hinzu und gibt newChild zurück. War der Knoten bereits im Baum, wird er zuerst daraus entfernt.
- Node.insertBefore(newChild, refChild)¶
Fügt einen neuen Kindknoten vor einem vorhandenen Kindknoten ein. refChild muss ein Kindknoten dieses Knotens sein, sonst wird
NotFoundErrausgelöst. Zurückgegeben wird newChild. Ist refChildNone, wird newChild am Ende der Liste der Kindknoten eingefügt.
- Node.removeChild(oldChild)¶
Entfernt einen Kindknoten. oldChild muss ein Kindknoten dieses Knotens sein, sonst wird
NotFoundErrausgelöst. Bei Erfolg wird oldChild zurückgegeben. Wird oldChild nicht weiter verwendet, sollte seine Methodeunlink()aufgerufen werden.
- Node.replaceChild(newChild, oldChild)¶
Ersetzt einen vorhandenen Knoten durch einen neuen. oldChild muss ein Kindknoten dieses Knotens sein, sonst wird
NotFoundErrausgelöst.
- Node.normalize()¶
Fügt benachbarte Textknoten zusammen, sodass jeder zusammenhängende Text in einer einzigen
Text-Instanz liegt. Für viele Anwendungen wird die Verarbeitung von Text aus einem DOM-Baum dadurch einfacher.
- Node.cloneNode(deep)¶
Klont diesen Knoten. Setzt man deep, werden alle Kindknoten mitgeklont. Zurückgegeben wird der Klon.
NodeList-Objekte¶
A NodeList represents a sequence of nodes. These objects are used in
two ways in the DOM Core recommendation: an Element object provides
one as its list of child nodes, and the getElementsByTagName()
and getElementsByTagNameNS() methods of Element return
objects with this interface to represent query results.
Die Empfehlung DOM Level 2 legt für diese Objekte eine Methode und ein Attribut fest:
- NodeList.item(i)¶
Gibt das i-te Element der Folge zurück oder
None, wenn i außerhalb des Bereichs liegt. Negative Indizes werden nicht unterstützt.
- NodeList.length¶
Die Anzahl der Knoten in der Folge.
Zusätzlich verlangt die Python-DOM-Schnittstelle etwas Unterstützung darüber hinaus, damit sich NodeList-Objekte als Python-Sequenzen verwenden lassen. Alle NodeList-Umsetzungen müssen __len__() und __getitem__() unterstützen. Damit lässt sich über die NodeList in for-Anweisungen iterieren, und die integrierte Funktion len() arbeitet richtig.
Erlaubt eine DOM-Umsetzung, das Dokument zu ändern, muss die NodeList-Umsetzung auch die Methoden __setitem__() und __delitem__() unterstützen.
DocumentType-Objekte¶
Angaben zu den Notationen und Entitäten, die ein Dokument deklariert – einschließlich der externen Teilmenge, sofern der Parser sie verwendet und die Angaben liefern kann –, stehen an einem DocumentType-Objekt. Der DocumentType eines Dokuments steht im Attribut doctype des Document-Objekts. Hat das Dokument keine DOCTYPE-Deklaration, ist sein doctype-Attribut None statt einer Instanz dieser Schnittstelle.
DocumentType ist eine Spezialisierung von Node und ergänzt die folgenden Attribute:
- DocumentType.publicId¶
Der öffentliche Identifikator der externen Teilmenge der Dokumenttypdefinition oder
None, wenn dieDOCTYPE-Deklaration ihn nicht angibt.
- DocumentType.systemId¶
Der System-Identifikator – eine URI – der externen Teilmenge der Dokumenttypdefinition oder
None, wenn dieDOCTYPE-Deklaration ihn nicht angibt.
- DocumentType.internalSubset¶
Eine Zeichenkette mit der vollständigen internen Teilmenge des Dokuments, ohne die Klammern, die die Teilmenge einschließen. Hat das Dokument keine interne Teilmenge, sollte der Wert
Nonesein.
- DocumentType.name¶
Der Name des Wurzelelements, wie ihn die
DOCTYPE-Deklaration angibt, sofern vorhanden.
- DocumentType.entities¶
Eine
NamedNodeMapvonEntity-Knoten mit den Definitionen externer Entitäten. Ist ein Entitätsname mehrfach definiert, wird nur die erste Definition geliefert; die übrigen werden übergangen, wie es die XML-Empfehlung verlangt. Der Wert kannNonesein, wenn der Parser die Angaben nicht liefert oder keine Entitäten definiert sind.
- DocumentType.notations¶
Eine
NamedNodeMapvonNotation-Knoten mit den Definitionen der Notationen. Ist ein Notationsname mehrfach definiert, wird nur die erste Definition geliefert; die übrigen werden übergangen, wie es die XML-Empfehlung verlangt. Der Wert kannNonesein, wenn der Parser die Angaben nicht liefert oder keine Notationen definiert sind.
Document-Objekte¶
Ein Document stellt ein gesamtes XML-Dokument dar, samt seinen Elementen, Attributen, Verarbeitungsanweisungen, Kommentaren und so weiter. Denk daran, dass es Eigenschaften von Node erbt.
- Document.documentElement¶
Das eine und einzige Wurzelelement des Dokuments.
- Document.doctype¶
Der
DocumentType-Knoten des Dokuments oderNone. Dieses Attribut ist nur lesbar.
- Document.implementation¶
Das
DOMImplementation-Objekt, das dieses Dokument erzeugt hat. Dieses Attribut ist nur lesbar.
- Document.strictErrorChecking¶
Ob die Fehlerprüfung erzwungen wird.
- Document.documentURI¶
Der Ort des Dokuments oder
None, wenn er unbekannt ist.
- Document.createDocumentFragment()¶
Erzeugt einen leeren
DocumentFragment-Knoten und gibt ihn zurück.
- Document.createCDATASection(data)¶
Erzeugt einen
CDATASection-Knoten mit dem Inhalt data und gibt ihn zurück.
- Document.importNode(importedNode, deep)¶
Gibt eine Kopie von importedNode zurück, die zu diesem Dokument gehört. Der ursprüngliche Knoten wird nicht aus seinem Dokument entfernt. Ist deep wahr, werden auch die Nachkommen des Knotens kopiert.
- Document.createElement(tagName)¶
Erzeugt einen neuen Elementknoten und gibt ihn zurück. Beim Erzeugen wird das Element nicht in das Dokument eingefügt; das musst du ausdrücklich mit einer der anderen Methoden tun, etwa
insertBefore()oderappendChild().
- Document.createElementNS(namespaceURI, tagName)¶
Erzeugt ein neues Element mit Namensraum und gibt es zurück. tagName darf ein Präfix haben. Beim Erzeugen wird das Element nicht in das Dokument eingefügt; das musst du ausdrücklich mit einer der anderen Methoden tun, etwa
insertBefore()oderappendChild().
- Document.createTextNode(data)¶
Erzeugt einen Textknoten mit den als Parameter übergebenen Daten und gibt ihn zurück. Wie die anderen Erzeugungsmethoden fügt auch diese den Knoten nicht in den Baum ein.
- Document.createComment(data)¶
Erzeugt einen Kommentarknoten mit den als Parameter übergebenen Daten und gibt ihn zurück. Wie die anderen Erzeugungsmethoden fügt auch diese den Knoten nicht in den Baum ein.
- Document.createProcessingInstruction(target, data)¶
Erzeugt einen Knoten für eine Verarbeitungsanweisung mit den als Parameter übergebenen Werten target und data und gibt ihn zurück. Wie die anderen Erzeugungsmethoden fügt auch diese den Knoten nicht in den Baum ein.
- Document.createAttribute(name)¶
Erzeugt einen Attributknoten und gibt ihn zurück. Diese Methode ordnet den Attributknoten keinem bestimmten Element zu. Um die neu erzeugte Attributinstanz zu verwenden, musst du
setAttributeNode()am passendenElement-Objekt aufrufen.
- Document.createAttributeNS(namespaceURI, qualifiedName)¶
Erzeugt einen Attributknoten mit Namensraum und gibt ihn zurück. tagName darf ein Präfix haben. Diese Methode ordnet den Attributknoten keinem bestimmten Element zu. Um die neu erzeugte Attributinstanz zu verwenden, musst du
setAttributeNode()am passendenElement-Objekt aufrufen.
- Document.getElementById(id)¶
Gibt das Element mit der angegebenen ID zurück oder
None. Durchsucht werden nur Attribute, die in der DTD oder überElement.setIdAttribute()als Typ ID deklariert sind.
- Document.getElementsByTagName(tagName)¶
Sucht alle Nachkommen – unmittelbare Kindknoten, deren Kindknoten und so weiter – mit einem bestimmten Elementtypnamen.
- Document.getElementsByTagNameNS(namespaceURI, localName)¶
Sucht alle Nachkommen – unmittelbare Kindknoten, deren Kindknoten und so weiter – mit einer bestimmten Namensraum-URI und einem bestimmten lokalen Namen. Der lokale Name ist der Teil des Namensraums nach dem Präfix.
- Document.renameNode(n, namespaceURI, name)¶
Benennt den Element- oder Attributknoten n um und gibt ihn zurück. namespaceURI ist die neue Namensraum-URI oder
EMPTY_NAMESPACE, wenn der Knoten zu keinem Namensraum gehört. name ist der neue qualifizierte Name.Löst
WrongDocumentErraus, wenn n von einem anderen Dokument erzeugt wurde, undNotSupportedErr, wenn es weder ein Element noch ein Attribut ist.
Element-Objekte¶
Element ist eine Unterklasse von Node und erbt damit alle Attribute dieser Klasse.
- Element.tagName¶
Der Name des Elementtyps. In einem Dokument mit Namensräumen kann er Doppelpunkte enthalten. Der Wert ist eine Zeichenkette.
- Element.setIdAttribute(name)¶
Deklariert das Attribut name als Typ ID, sodass das Element über
Document.getElementById()gefunden wird. LöstNotFoundErraus, wenn das Element kein solches Attribut hat.
- Element.setIdAttributeNS(namespaceURI, localName)¶
Dasselbe wie
setIdAttribute(), aber für ein Attribut, das über seine Namensraum-URI und seinen lokalen Namen angegeben wird.
- Element.setIdAttributeNode(idAttr)¶
Dasselbe wie
setIdAttribute(), aber für einen bereits abgerufenen Attributknoten.
- Element.getElementsByTagNameNS(namespaceURI, localName)¶
Dasselbe wie die entsprechende Methode der Klasse
Document.
- Element.hasAttribute(name)¶
Gibt
Truezurück, wenn das Element ein Attribut mit dem Namen name hat.
- Element.hasAttributeNS(namespaceURI, localName)¶
Gibt
Truezurück, wenn das Element ein Attribut mit namespaceURI und localName hat.
- Element.getAttribute(name)¶
Gibt den Wert des Attributs mit dem Namen name als Zeichenkette zurück. Gibt es kein solches Attribut, wird eine leere Zeichenkette zurückgegeben, als hätte das Attribut keinen Wert.
- Element.getAttributeNode(attrname)¶
Gibt den
Attr-Knoten des Attributs mit dem Namen attrname zurück.
- Element.getAttributeNS(namespaceURI, localName)¶
Gibt den Wert des Attributs mit namespaceURI und localName als Zeichenkette zurück. Gibt es kein solches Attribut, wird eine leere Zeichenkette zurückgegeben, als hätte das Attribut keinen Wert.
- Element.getAttributeNodeNS(namespaceURI, localName)¶
Gibt einen Attributwert als Knoten zurück, zu gegebenem namespaceURI und localName.
- Element.removeAttribute(name)¶
Entfernt ein Attribut über seinen Namen.
- Element.removeAttributeNode(oldAttr)¶
Entfernt oldAttr aus der Attributliste und gibt es zurück, sofern es vorhanden ist. Ist oldAttr nicht vorhanden, wird
NotFoundErrausgelöst.
- Element.removeAttributeNS(namespaceURI, localName)¶
Entfernt ein Attribut über seinen Namen. Beachte, dass dabei ein localName verwendet wird und kein qname.
- Element.setAttribute(name, value)¶
Setzt einen Attributwert aus einer Zeichenkette.
- Element.setAttributeNode(newAttr)¶
Fügt dem Element einen neuen Attributknoten hinzu und ersetzt dabei nötigenfalls ein vorhandenes Attribut, wenn das Attribut
nameübereinstimmt. Kommt es zu einer Ersetzung, wird der alte Attributknoten zurückgegeben. Ist newAttr schon in Verwendung, wirdInuseAttributeErrausgelöst.
- Element.setAttributeNodeNS(newAttr)¶
Fügt dem Element einen neuen Attributknoten hinzu und ersetzt dabei nötigenfalls ein vorhandenes Attribut, wenn die Attribute
namespaceURIundlocalNameübereinstimmen. Kommt es zu einer Ersetzung, wird der alte Attributknoten zurückgegeben. Ist newAttr schon in Verwendung, wirdInuseAttributeErrausgelöst.
- Element.setAttributeNS(namespaceURI, qname, value)¶
Setzt einen Attributwert aus einer Zeichenkette, zu gegebenem namespaceURI und qname. Beachte, dass ein qname der gesamte Attributname ist – anders als oben.
Attr-Objekte¶
Attr erbt von Node und damit alle seine Attribute.
Attributknoten gehören nicht zum Dokumentbaum. Sie liegen in der attributes-Abbildung eines Elements und nicht unter seinen Kindknoten, und parentNode, previousSibling und nextSibling sind bei ihnen immer None.
- Attr.name¶
Der Name des Attributs. In einem Dokument mit Namensräumen kann er einen Doppelpunkt enthalten.
- Attr.localName¶
Der Teil des Namens nach dem Doppelpunkt, sofern es einen gibt, sonst der gesamte Name. Dieses Attribut ist nur lesbar.
- Attr.prefix¶
Der Teil des Namens vor dem Doppelpunkt, sofern es einen gibt, sonst die leere Zeichenkette.
- Attr.isId¶
Ob dieses Attribut den Typ ID hat, weil es entweder in der DTD so deklariert ist oder weil
Element.setIdAttribute()verwendet wurde. Dieses Attribut ist nur lesbar.
- Attr.ownerElement¶
Der
Element-Knoten, zu dem dieses Attribut gehört, oderNone, wenn es nicht verwendet wird. Dieses Attribut ist nur lesbar.
- Attr.specified¶
Ob der Wert des Attributs im Dokument ausdrücklich gesetzt wurde, im Gegensatz zu einem Vorgabewert aus der DTD. Dieses Attribut ist nur lesbar.
NamedNodeMap-Objekte¶
NamedNodeMap erbt nicht von Node.
- NamedNodeMap.length¶
Die Länge der Attributliste.
- NamedNodeMap.item(index)¶
Gibt das Attribut an einem bestimmten Index zurück. In welcher Reihenfolge du die Attribute bekommst, ist beliebig, bleibt aber über die Lebensdauer eines DOM gleich. Jedes Element ist ein Attributknoten. Seinen Wert bekommst du über das Attribut
value.
- NamedNodeMap.getNamedItem(name)¶
Gibt den Knoten mit dem angegebenen
namezurück oderNone, wenn es keinen solchen Knoten gibt.
- NamedNodeMap.getNamedItemNS(namespaceURI, localName)¶
Gibt den Knoten mit der angegebenen Namensraum-URI und dem angegebenen lokalen Namen zurück oder
None, wenn es keinen solchen Knoten gibt.
- NamedNodeMap.setNamedItem(node)¶
Fügt node der Abbildung hinzu, mit seinem
nameals Schlüssel. Gibt den Knoten zurück, den er ersetzt, oderNone, wenn er keinen Knoten ersetzt.
- NamedNodeMap.setNamedItemNS(node)¶
Fügt node der Abbildung hinzu, mit seiner Namensraum-URI und seinem lokalen Namen als Schlüssel. Gibt den Knoten zurück, den er ersetzt, oder
None, wenn er keinen Knoten ersetzt.
- NamedNodeMap.removeNamedItem(name)¶
Entfernt den Knoten mit dem angegebenen
nameund gibt ihn zurück. LöstNotFoundErraus, wenn es keinen solchen Knoten gibt.
- NamedNodeMap.removeNamedItemNS(namespaceURI, localName)¶
Entfernt den Knoten mit der angegebenen Namensraum-URI und dem angegebenen lokalen Namen und gibt ihn zurück. Löst
NotFoundErraus, wenn es keinen solchen Knoten gibt.
Du kannst an den Element-Objekten auch die standardisierte Methodenfamilie getAttribute*() verwenden.
DocumentFragment-Objekte¶
DocumentFragment ist ein leichtgewichtiger Behälter für Knoten und eine Unterklasse von Node. Wird es in den Dokumentbaum eingefügt, werden an seiner Stelle seine Kindknoten eingefügt und es bleibt leer zurück.
CharacterData-Objekte¶
CharacterData stellt textartige Daten im XML-Dokument dar. Es ist eine Unterklasse von Node und die Basisklasse von Text, CDATASection und Comment. Solche Knoten können keine Kindknoten haben.
- CharacterData.data¶
Der Inhalt des Knotens als Zeichenkette.
Text- und CDATASection-Objekte¶
Die Schnittstelle Text stellt Text im XML-Dokument dar. Unterstützen Parser und DOM-Umsetzung die XML-Erweiterung des DOM, werden Textteile in markierten CDATA-Abschnitten in CDATASection-Objekten abgelegt. Die beiden Schnittstellen sind gleich, liefern aber verschiedene Werte für das Attribut nodeType.
Text erweitert die Schnittstelle CharacterData, und CDATASection erweitert Text.
- Text.data¶
Der Inhalt des Textknotens als Zeichenkette.
- Text.wholeText¶
Der Text aller
Text-Knoten, die logisch an diesen Knoten angrenzen, in der Reihenfolge des Dokuments aneinandergefügt. Dieses Attribut ist nur lesbar.
- Text.replaceWholeText(content)¶
Ersetzt den Text aller
Text-Knoten, die logisch an diesen Knoten angrenzen, durch content und entfernt die übrigen Knoten. Gibt diesen Knoten zurück oderNone, wenn content leer ist.
- Text.splitText(offset)¶
Teilt diesen Knoten an offset in zwei Knoten, behält den ersten Teil in diesem Knoten und gibt einen neuen Geschwisterknoten mit dem Rest zurück.
Bemerkung
Dass ein CDATASection-Knoten verwendet wird, bedeutet nicht, dass der Knoten einen vollständigen markierten CDATA-Abschnitt darstellt, sondern nur, dass sein Inhalt Teil eines CDATA-Abschnitts war. Ein einzelner CDATA-Abschnitt kann im Dokumentbaum durch mehrere Knoten dargestellt werden. Es gibt keine Möglichkeit festzustellen, ob zwei benachbarte CDATASection-Knoten zu verschiedenen markierten CDATA-Abschnitten gehören.
ProcessingInstruction-Objekte¶
Stellt eine Verarbeitungsanweisung im XML-Dokument dar. Erbt von der Schnittstelle Node und kann keine Kindknoten haben.
- ProcessingInstruction.target¶
Der Inhalt der Verarbeitungsanweisung bis zum ersten Leerraumzeichen. Dieses Attribut ist nur lesbar.
- ProcessingInstruction.data¶
Der Inhalt der Verarbeitungsanweisung nach dem ersten Leerraumzeichen.
Entity-Objekte¶
Entity stellt eine geparste oder nicht geparste Entität dar, die in der DTD deklariert ist. Es ist eine Unterklasse von Node. Entitätsknoten liegen in DocumentType.entities und lassen sich nicht in den Dokumentbaum einfügen. Der Name der Entität ist ihr nodeName.
- Entity.publicId¶
Der öffentliche Identifikator der Entität oder
None, wenn er nicht angegeben ist. Dieses Attribut ist nur lesbar.
- Entity.systemId¶
Der System-Identifikator der Entität oder
None, wenn er nicht angegeben ist. Dieses Attribut ist nur lesbar.
- Entity.notationName¶
Der Name der Notation bei einer nicht geparsten Entität oder
Nonebei einer geparsten Entität. Dieses Attribut ist nur lesbar.
Notation-Objekte¶
Notation stellt eine Notation dar, die in der DTD deklariert ist. Es ist eine Unterklasse von Node und kann keine Kindknoten haben. Notationsknoten liegen in DocumentType.notations und lassen sich nicht in den Dokumentbaum einfügen. Der Name der Notation ist ihr nodeName.
- Notation.publicId¶
Der öffentliche Identifikator der Notation oder
None, wenn er nicht angegeben ist. Dieses Attribut ist nur lesbar.
- Notation.systemId¶
Der System-Identifikator der Notation oder
None, wenn er nicht angegeben ist. Dieses Attribut ist nur lesbar.
Ausnahmen¶
Die Empfehlung DOM Level 2 legt eine einzige Ausnahme, DOMException, und eine Reihe von Konstanten fest, mit denen Anwendungen feststellen können, welche Art von Fehler aufgetreten ist. DOMException-Instanzen tragen ein Attribut code mit dem passenden Wert für die jeweilige Ausnahme.
Die Python-DOM-Schnittstelle stellt diese Konstanten bereit, erweitert aber zugleich den Satz der Ausnahmen, sodass es für jeden vom DOM festgelegten Ausnahmecode eine eigene Ausnahme gibt. Die Umsetzungen müssen die passende eigene Ausnahme auslösen. Jede davon trägt den passenden Wert für das Attribut code.
- exception xml.dom.DOMException¶
Basisausnahmeklasse für alle einzelnen DOM-Ausnahmen. Diese Ausnahmeklasse lässt sich nicht unmittelbar instanzieren.
- exception xml.dom.DomstringSizeErr¶
Wird ausgelöst, wenn ein angegebener Textbereich nicht in eine Zeichenkette passt. In den Python-DOM-Umsetzungen ist keine Verwendung bekannt, aus DOM-Umsetzungen, die nicht in Python geschrieben sind, kann die Ausnahme aber kommen.
- exception xml.dom.HierarchyRequestErr¶
Wird ausgelöst, wenn versucht wird, einen Knoten dort einzufügen, wo dieser Knotentyp nicht erlaubt ist.
- exception xml.dom.IndexSizeErr¶
Wird ausgelöst, wenn ein Index- oder Größenparameter einer Methode negativ ist oder die erlaubten Werte überschreitet.
- exception xml.dom.InuseAttributeErr¶
Wird ausgelöst, wenn versucht wird, einen
Attr-Knoten einzufügen, der schon an anderer Stelle im Dokument vorkommt.
- exception xml.dom.InvalidAccessErr¶
Wird ausgelöst, wenn ein Parameter oder eine Operation am zugrunde liegenden Objekt nicht unterstützt wird.
- exception xml.dom.InvalidCharacterErr¶
Diese Ausnahme wird ausgelöst, wenn ein Zeichenkettenparameter ein Zeichen enthält, das die XML-1.0-Empfehlung im jeweiligen Zusammenhang nicht erlaubt. Versucht man zum Beispiel, einen
Element-Knoten mit einem Leerzeichen im Elementtypnamen zu erzeugen, wird dieser Fehler ausgelöst.
- exception xml.dom.InvalidModificationErr¶
Wird ausgelöst, wenn versucht wird, den Typ eines Knotens zu ändern.
- exception xml.dom.InvalidStateErr¶
Wird ausgelöst, wenn versucht wird, ein Objekt zu verwenden, das nicht definiert oder nicht mehr brauchbar ist.
- exception xml.dom.NamespaceErr¶
Wird ausgelöst, wenn versucht wird, ein Objekt auf eine Weise zu ändern, die die Empfehlung Namespaces in XML nicht erlaubt.
- exception xml.dom.NotFoundErr¶
Ausnahme, wenn ein Knoten im angesprochenen Zusammenhang nicht vorhanden ist.
NamedNodeMap.removeNamedItem()löst sie zum Beispiel aus, wenn der übergebene Knoten nicht in der Abbildung vorkommt.
- exception xml.dom.NotSupportedErr¶
Wird ausgelöst, wenn die Umsetzung den verlangten Objekttyp oder die verlangte Operation nicht unterstützt.
- exception xml.dom.NoDataAllowedErr¶
Wird ausgelöst, wenn für einen Knoten Daten angegeben werden, der keine Daten unterstützt.
- exception xml.dom.NoModificationAllowedErr¶
Wird ausgelöst, wenn versucht wird, ein Objekt zu ändern, bei dem Änderungen nicht erlaubt sind, etwa bei nur lesbaren Knoten.
- exception xml.dom.SyntaxErr¶
Wird ausgelöst, wenn eine ungültige oder unerlaubte Zeichenkette angegeben wird.
- exception xml.dom.ValidationErr¶
Wird ausgelöst, wenn eine Operation das Dokument im Sinne der teilweisen Gültigkeit ungültig machen würde. In den Python-DOM-Umsetzungen ist keine Verwendung bekannt, aus DOM-Umsetzungen, die nicht in Python geschrieben sind, kann die Ausnahme aber kommen.
- exception xml.dom.WrongDocumentErr¶
Wird ausgelöst, wenn ein Knoten in ein anderes Dokument eingefügt wird als das, zu dem er derzeit gehört, und die Umsetzung es nicht unterstützt, den Knoten von einem Dokument in das andere zu überführen.
Die in der DOM-Empfehlung festgelegten Ausnahmecodes entsprechen den oben beschriebenen Ausnahmen gemäß dieser Tabelle:
Konstante |
Ausnahme |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Konformität¶
Dieser Abschnitt beschreibt die Anforderungen an die Konformität und die Beziehungen zwischen der Python-DOM-API, den DOM-Empfehlungen des W3C und der OMG-IDL-Abbildung für Python.
Typabbildung¶
Die IDL-Typen der DOM-Spezifikation werden gemäß der folgenden Tabelle auf Python-Typen abgebildet.
IDL-Typ |
Python-Typ |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Zugriffsmethoden¶
Die Abbildung von OMG IDL auf Python legt Zugriffsfunktionen für attribute-Deklarationen in IDL weitgehend so fest, wie es die Java-Abbildung tut. Bildet man die IDL-Deklarationen
readonly attribute string someValue;
attribute string anotherValue;
ab, so ergeben sich drei Zugriffsfunktionen: eine „get“-Methode für someValue (_get_someValue()) sowie „get“- und „set“-Methoden für anotherValue (_get_anotherValue() und _set_anotherValue()). Insbesondere verlangt die Abbildung nicht, dass die IDL-Attribute wie gewöhnliche Python-Attribute zugänglich sind: object.someValue muss nicht funktionieren und darf einen AttributeError auslösen.
Die Python-DOM-API verlangt dagegen schon, dass der gewöhnliche Attributzugriff funktioniert. Die typischen Surrogate, die Python-IDL-Compiler erzeugen, funktionieren daher wahrscheinlich nicht, und auf der Client-Seite können Hüllobjekte nötig sein, wenn die DOM-Objekte über CORBA angesprochen werden. Für CORBA-DOM-Clients heißt das etwas zusätzliche Überlegung. Wer Erfahrung damit hat, DOM aus Python über CORBA zu verwenden, hält das aber nicht für ein Problem. Attribute, die als readonly deklariert sind, schränken den Schreibzugriff nicht in allen DOM-Umsetzungen ein.
In der Python-DOM-API sind Zugriffsfunktionen nicht erforderlich. Werden sie bereitgestellt, sollten sie die Form haben, die die Python-IDL-Abbildung festlegt; sie gelten aber als unnötig, da die Attribute aus Python unmittelbar zugänglich sind. „Set“-Zugriffsfunktionen sollten für readonly-Attribute nie bereitgestellt werden.
Die IDL-Definitionen geben die Anforderungen der W3C-DOM-API nicht vollständig wieder, etwa die Vorstellung, dass bestimmte Objekte „lebend“ sind – zum Beispiel der Rückgabewert von getElementsByTagName(). Die Python-DOM-API verlangt nicht, dass Umsetzungen solche Anforderungen durchsetzen.
Comment-Objekte¶
Commentstellt einen Kommentar im XML-Dokument dar. Es ist eine Unterklasse vonCharacterData.Der Inhalt des Kommentars als Zeichenkette. Das Attribut enthält alle Zeichen zwischen dem einleitenden
<!--und dem abschließenden-->, diese selbst aber nicht.