xml.dom — Die Document Object Model API¶
Quellcode: Lib/xml/dom/__init__.py
Das Document Object Model, oder „DOM“, ist eine sprachübergreifende API des World Wide Web Consortium (W3C) für den Zugriff auf und die Modifikation von XML-Dokumenten. Eine DOM-Implementierung präsentiert ein XML-Dokument als Baumstruktur oder ermöglicht es dem Client-Code, eine solche Struktur von Grund auf neu aufzubauen. Anschließend gewährt sie Zugriff auf die Struktur über eine Reihe von Objekten, die bekannte Schnittstellen bereitstellen.
DOM ist äußerst nützlich für Anwendungen mit wahlfreiem Zugriff. SAX bietet Ihnen nur jeweils eine Ansicht eines Teils des Dokuments. Wenn Sie gerade ein SAX-Element betrachten, haben Sie keinen Zugriff auf ein anderes. Wenn Sie einen Textknoten betrachten, haben Sie keinen Zugriff auf ein enthaltendes Element. Wenn Sie eine SAX-Anwendung schreiben, müssen Sie die Position Ihres Programms im Dokument irgendwo in Ihrem eigenen Code verfolgen. SAX tut dies nicht für Sie. Wenn Sie außerdem im XML-Dokument vorausschauen müssen, haben Sie einfach Pech.
Einige Anwendungen sind in einem ereignisgesteuerten Modell ohne Baumzugriff schlicht unmöglich. Natürlich könnten Sie bei SAX-Ereignissen eine Art Baum selbst aufbauen, aber DOM ermöglicht es Ihnen, das Schreiben dieses Codes zu vermeiden. DOM ist eine standardisierte Baurepräsentation für XML-Daten.
Das Document Object Model wird vom W3C in Phasen oder „Levels“ in deren Terminologie definiert. Die Python-Abbildung der API basiert im Wesentlichen auf der DOM Level 2 Empfehlung.
DOM-Anwendungen beginnen typischerweise damit, ein XML in ein DOM zu parsen. Wie dies erreicht wird, wird von DOM Level 1 überhaupt nicht behandelt, und Level 2 bietet nur begrenzte Verbesserungen: Es gibt eine DOMImplementation Objektklasse, die Zugriff auf Document Erstellungsmethoden bietet, aber keine Möglichkeit, einen XML-Reader/Parser/Dokument-Builder auf eine implementierungsunabhängige Weise anzusprechen. Es gibt auch keine gut definierte Möglichkeit, auf diese Methoden ohne ein vorhandenes Document Objekt zuzugreifen. In Python stellt jede DOM-Implementierung eine Funktion getDOMImplementation() bereit. DOM Level 3 fügt eine Load/Store-Spezifikation hinzu, die eine Schnittstelle zum Reader definiert, aber diese ist in der Python-Standardbibliothek noch nicht verfügbar.
Sobald Sie ein DOM-Dokumentobjekt haben, können Sie auf die Teile Ihres XML-Dokuments über seine Eigenschaften und Methoden zugreifen. Diese Eigenschaften sind in der DOM-Spezifikation definiert; dieser Teil des Referenzhandbuchs beschreibt die Interpretation der Spezifikation in Python.
Die vom W3C bereitgestellte Spezifikation definiert die DOM-API für Java, ECMAScript und OMG IDL. Die hier definierte Python-Abbildung basiert größtenteils auf der IDL-Version der Spezifikation, aber eine strikte Konformität ist nicht erforderlich (obwohl Implementierungen frei stehen, die strikte Abbildung von IDL zu unterstützen). Siehe Abschnitt Konformität für eine detaillierte Diskussion der Abbildungsanforderungen.
Siehe auch
- Document Object Model (DOM) Level 2 Specification
Die W3C-Empfehlung, auf der die Python DOM API basiert.
- Document Object Model (DOM) Level 1 Specification
Die W3C-Empfehlung für das von
xml.dom.minidomunterstützte DOM.- Python Language Mapping Specification
Diese spezifiziert die Abbildung von OMG IDL auf Python.
Modulinhalt¶
Das xml.dom enthält die folgenden Funktionen
- xml.dom.registerDOMImplementation(name, factory)¶
Registriert die factory-Funktion unter dem Namen name. Die factory-Funktion sollte ein Objekt zurückgeben, das die
DOMImplementationSchnittstelle implementiert. Die factory-Funktion kann jedes Mal dasselbe Objekt zurückgeben oder bei jedem Aufruf ein neues, je nach spezifischer Implementierung (z.B. wenn diese eine gewisse Anpassung unterstützt).
- xml.dom.getDOMImplementation(name=None, features=())¶
Gibt eine geeignete DOM-Implementierung zurück. name ist entweder ein bekannter Name, der Modulname einer DOM-Implementierung oder
None. Wenn es nichtNoneist, wird das entsprechende Modul importiert und einDOMImplementationObjekt zurückgegeben, falls der Import erfolgreich ist. Wenn kein Name angegeben ist und die UmgebungsvariablePYTHON_DOMgesetzt ist, wird diese Variable verwendet, um die Implementierung zu finden.Wenn kein Name angegeben ist, werden die verfügbaren Implementierungen untersucht, um eine mit dem erforderlichen Satz von Merkmalen zu finden. Wenn keine Implementierung gefunden werden kann, wird eine
ImportErrorausgelöst. Die features-Liste muss eine Sequenz von(feature, version)-Paaren sein, die an diehasFeature()-Methode auf verfügbarenDOMImplementation-Objekten übergeben werden.
Einige Komfortkonstanten werden ebenfalls bereitgestellt
- xml.dom.EMPTY_NAMESPACE¶
Der Wert, der verwendet wird, um anzuzeigen, dass kein Namespace mit einem Knoten im DOM verbunden ist. Dies wird typischerweise als
namespaceURIeines Knotens gefunden oder als namespaceURI-Parameter für namensraumspezifische Methoden verwendet.
- xml.dom.XML_NAMESPACE¶
Die Namespace-URI, die dem reservierten Präfix
xmlzugeordnet ist, wie in den Namespaces in XML (Abschnitt 4) definiert.
- xml.dom.XMLNS_NAMESPACE¶
Die Namespace-URI für Namensdeklarationen, wie in Document Object Model (DOM) Level 2 Core Specification (Abschnitt 1.1.8) definiert.
- xml.dom.XHTML_NAMESPACE¶
Die URI des XHTML-Namespaces, wie in XHTML 1.0: The Extensible HyperText Markup Language (Abschnitt 3.1.1) definiert.
Zusätzlich enthält xml.dom eine Basis- Node Klasse und die DOM-Ausnahmeklassen. Die von diesem Modul bereitgestellte Node-Klasse implementiert keine der von der DOM-Spezifikation definierten Methoden oder Attribute; konkrete DOM-Implementierungen müssen diese bereitstellen. Die als Teil dieses Moduls bereitgestellte Node-Klasse bietet die Konstanten, die für das Attribut nodeType auf konkreten Node-Objekten verwendet werden; sie befinden sich innerhalb der Klasse und nicht auf Modulebene, um der DOM-Spezifikation zu entsprechen.
Objekte im DOM¶
Die maßgebliche Dokumentation für DOM ist die DOM-Spezifikation des W3C.
Beachten Sie, dass DOM-Attribute auch als Knoten und nicht als einfache Zeichenketten manipuliert werden können. Es ist jedoch eher selten, dass Sie dies tun müssen, daher ist diese Verwendung noch nicht dokumentiert.
Schnittstelle |
Abschnitt |
Zweck |
|---|---|---|
|
Schnittstelle zur zugrunde liegenden Implementierung. |
|
|
Basisschnittstelle für die meisten Objekte in einem Dokument. |
|
|
Schnittstelle für eine Sequenz von Knoten. |
|
|
Informationen über die Deklarationen, die zur Verarbeitung eines Dokuments erforderlich sind. |
|
|
Objekt, das ein gesamtes Dokument repräsentiert. |
|
|
Elementknoten in der Dokumenthierarchie. |
|
|
Attributwertknoten auf Elementknoten. |
|
|
Repräsentation von Kommentaren im Quelldokument. |
|
|
Knoten, die Textinhalte aus dem Dokument enthalten. |
|
|
Repräsentation von Verarbeitungshinweisen. |
Ein zusätzlicher Abschnitt beschreibt die Ausnahmen, die bei der Arbeit mit DOM in Python definiert sind.
DOMImplementation Objekte¶
Die DOMImplementation Schnittstelle bietet Anwendungen eine Möglichkeit, die Verfügbarkeit bestimmter Merkmale in dem von ihnen verwendeten DOM zu ermitteln. DOM Level 2 fügte die Möglichkeit hinzu, neue Document und DocumentType Objekte unter Verwendung der DOMImplementation zu erstellen.
- DOMImplementation.hasFeature(feature, version)¶
Gibt
Truezurück, wenn das Merkmal, das durch das Paar von Zeichenketten feature und version identifiziert wird, implementiert ist.
- DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)¶
Gibt ein neues
DocumentObjekt (die Wurzel des DOM) mit einem untergeordnetenElementObjekt zurück, das den angegebenen namespaceUri und qualifiedName hat. Der doctype muss einDocumentTypeObjekt sein, das voncreateDocumentType()erstellt wurde, oderNone. In der Python DOM API können die ersten beiden Argumente auchNonesein, um anzuzeigen, dass kein untergeordnetesElementerstellt werden soll.
- DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)¶
Gibt ein neues
DocumentTypeObjekt zurück, das den angegebenen qualifiedName-, publicId- und systemId-Zeichenketten kapselt und die in einer XML-Dokumenttypdeklaration enthaltenen Informationen repräsentiert.
Node Objekte¶
Alle Komponenten eines XML-Dokuments sind Unterklassen von Node.
- Node.nodeType¶
Eine Ganzzahl, die den Knotentyp darstellt. Symbolische Konstanten für die Typen befinden sich auf dem
NodeObjekt:ELEMENT_NODE,ATTRIBUTE_NODE,TEXT_NODE,CDATA_SECTION_NODE,ENTITY_NODE,PROCESSING_INSTRUCTION_NODE,COMMENT_NODE,DOCUMENT_NODE,DOCUMENT_TYPE_NODE,NOTATION_NODE. Dies ist ein schreibgeschütztes Attribut.
- Node.parentNode¶
Der übergeordnete Knoten des aktuellen Knotens oder
Nonefür den Dokumentknoten. Der Wert ist immer einNodeObjekt oderNone. FürElementKnoten ist dies das übergeordnete Element, außer für das Wurzel-Element, in welchem Fall es dasDocumentObjekt ist. FürAttrKnoten ist dies immerNone. Dies ist ein schreibgeschütztes Attribut.
- Node.attributes¶
Eine
NamedNodeMapvon Attributobjekten. Nur Elemente haben tatsächliche Werte dafür; andere liefernNonefür dieses Attribut. Dies ist ein schreibgeschütztes Attribut.
- Node.previousSibling¶
Der Knoten, der diesem Knoten mit demselben Elternknoten unmittelbar vorausgeht. Zum Beispiel das Element mit einem End-Tag, das direkt vor dem Start-Tag des *selbst*-Elements kommt. Natürlich bestehen XML-Dokumente aus mehr als nur Elementen, sodass das vorherige Geschwisterkind Text, ein Kommentar oder etwas anderes sein kann. Wenn dieser Knoten das erste Kind des Elternknotens ist, wird dieses Attribut
Nonesein. Dies ist ein schreibgeschütztes Attribut.
- Node.nextSibling¶
Der Knoten, der diesem Knoten mit demselben Elternknoten unmittelbar folgt. Siehe auch
previousSibling. Wenn dies das letzte Kind des Elternknotens ist, wird dieses AttributNonesein. Dies ist ein schreibgeschütztes Attribut.
- Node.childNodes¶
Eine Liste von Knoten, die in diesem Knoten enthalten sind. Dies ist ein schreibgeschütztes Attribut.
- Node.firstChild¶
Das erste Kind des Knotens, falls vorhanden, oder
None. Dies ist ein schreibgeschütztes Attribut.
- Node.lastChild¶
Das letzte Kind des Knotens, falls vorhanden, oder
None. Dies ist ein schreibgeschütztes Attribut.
- Node.localName¶
Der Teil des
tagName, der dem Doppelpunkt folgt, falls vorhanden, andernfalls der gesamtetagName. Der Wert ist eine Zeichenkette.
- Node.prefix¶
Der Teil des
tagName, der dem Doppelpunkt vorausgeht, falls vorhanden, andernfalls die leere Zeichenkette. Der Wert ist eine Zeichenkette oderNone.
- Node.namespaceURI¶
Der Namespace, der dem Elementnamen zugeordnet ist. Dies ist eine Zeichenkette oder
None. Dies ist ein schreibgeschütztes Attribut.
- Node.nodeName¶
Dies hat eine andere Bedeutung für jeden Knotentyp; siehe die DOM-Spezifikation für Details. Sie können die hier erhaltenen Informationen immer von einer anderen Eigenschaft erhalten, wie z.B. der
tagName-Eigenschaft für Elemente oder dername-Eigenschaft für Attribute. Für alle Knotentypen ist der Wert dieses Attributs entweder eine Zeichenkette oderNone. Dies ist ein schreibgeschütztes Attribut.
- Node.nodeValue¶
Dies hat eine andere Bedeutung für jeden Knotentyp; siehe die DOM-Spezifikation für Details. Die Situation ist ähnlich wie bei
nodeName. Der Wert ist eine Zeichenkette oderNone.
- 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 wie dieser Knoten verweist. Dies ist besonders nützlich für DOM-Implementierungen, die eine Art Proxy-Architektur verwenden (da mehr als ein Objekt auf denselben Knoten verweisen kann).Hinweis
Dies basiert auf einer vorgeschlagenen DOM Level 3 API, die sich noch im „Working Draft“-Stadium befindet, aber diese spezielle Schnittstelle erscheint unkontrovers. Änderungen am W3C werden diese Methode in der Python DOM-Schnittstelle nicht notwendigerweise beeinflussen (obwohl jede neue W3C-API dafür ebenfalls unterstützt würde).
- Node.appendChild(newChild)¶
Fügt einen neuen Kindknoten am Ende der Liste der Kinder zu diesem Knoten hinzu und gibt newChild zurück. Wenn der Knoten bereits im Baum vorhanden war, wird er zuerst entfernt.
- Node.insertBefore(newChild, refChild)¶
Fügt einen neuen Kindknoten vor einem vorhandenen Kind ein. Es muss gelten, dass refChild ein Kind dieses Knotens ist; andernfalls wird
ValueErrorausgelöst. newChild wird zurückgegeben. Wenn refChildNoneist, wird newChild am Ende der Kinderliste eingefügt.
- Node.removeChild(oldChild)¶
Entfernt einen Kindknoten. oldChild muss ein Kind dieses Knotens sein; andernfalls wird
ValueErrorausgelöst. oldChild wird bei Erfolg zurückgegeben. Wenn oldChild nicht mehr verwendet wird, sollte seineunlink()-Methode aufgerufen werden.
- Node.replaceChild(newChild, oldChild)¶
Ersetzt einen vorhandenen Knoten durch einen neuen Knoten. Es muss gelten, dass oldChild ein Kind dieses Knotens ist; andernfalls wird
ValueErrorausgelöst.
- Node.normalize()¶
Verbindet benachbarte Textknoten, sodass alle Textabschnitte als einzelne
Text-Instanzen gespeichert werden. Dies vereinfacht für viele Anwendungen die Verarbeitung von Text aus einem DOM-Baum.
- Node.cloneNode(deep)¶
Kopiert diesen Knoten. Wenn deep gesetzt ist, werden auch alle Kindknoten kopiert. Dies gibt die Kopie zurück.
NodeList Objekte¶
Eine NodeList repräsentiert eine Sequenz von Knoten. Diese Objekte werden in der DOM Core Empfehlung auf zwei Arten verwendet: Ein Element Objekt stellt eine solche als Liste seiner Kindknoten bereit, und die Methoden getElementsByTagName() und getElementsByTagNameNS() von Node geben Objekte mit dieser Schnittstelle zurück, um Abfrageergebnisse zu repräsentieren.
Die DOM Level 2 Empfehlung definiert eine Methode und ein Attribut für diese Objekte
- NodeList.item(i)¶
Gibt das i-te Element aus der Sequenz zurück, falls vorhanden, oder
None. Der Index i darf nicht kleiner als Null oder größer oder gleich der Länge der Sequenz sein.
- NodeList.length¶
Die Anzahl der Knoten in der Sequenz.
Darüber hinaus erfordert die Python DOM-Schnittstelle, dass zusätzliche Unterstützung bereitgestellt wird, um NodeList Objekte als Python-Sequenzen verwenden zu können. Alle NodeList Implementierungen müssen Unterstützung für __len__() und __getitem__() beinhalten; dies ermöglicht die Iteration über die NodeList in for-Anweisungen und die korrekte Unterstützung für die eingebaute Funktion len().
Wenn eine DOM-Implementierung die Änderung des Dokuments unterstützt, muss die NodeList-Implementierung auch die Methoden __setitem__() und __delitem__() unterstützen.
DocumentType-Objekte¶
Informationen über die von einem Dokument deklarierten Notationen und Entitäten (einschließlich des externen Teilmengen, falls der Parser diese verwendet und die Informationen bereitstellen kann) sind über ein DocumentType-Objekt verfügbar. Der DocumentType eines Dokuments ist über das Attribut doctype des Document-Objekts verfügbar; wenn für das Dokument keine DOCTYPE-Deklaration vorhanden ist, wird das Attribut doctype des Dokuments auf None anstelle einer Instanz dieser Schnittstelle gesetzt.
DocumentType ist eine Spezialisierung von Node und fügt die folgenden Attribute hinzu
- DocumentType.publicId¶
Der öffentliche Bezeichner für die externe Teilmenge der Dokumenttypdefinition. Dies ist ein String oder
None.
- DocumentType.systemId¶
Der Systembezeichner für die externe Teilmenge der Dokumenttypdefinition. Dies ist eine URI als String oder
None.
- DocumentType.internalSubset¶
Ein String, der die vollständige interne Teilmenge des Dokuments angibt. Dies schließt die Klammern, die die Teilmenge umschließen, nicht ein. Wenn das Dokument keine interne Teilmenge hat, sollte dies
Nonesein.
- DocumentType.name¶
Der Name des Wurzelelements gemäß der
DOCTYPE-Deklaration, falls vorhanden.
- DocumentType.entities¶
Dies ist ein
NamedNodeMap, der die Definitionen externer Entitäten enthält. Bei mehrmals definierten Entitätsnamen wird nur die erste Definition angegeben (andere werden gemäß der XML-Empfehlung ignoriert). Dies kannNonesein, wenn die Informationen nicht vom Parser bereitgestellt werden oder wenn keine Entitäten definiert sind.
- DocumentType.notations¶
Dies ist ein
NamedNodeMap, der die Definitionen von Notationen enthält. Bei mehrmals definierten Notationsnamen wird nur die erste Definition angegeben (andere werden gemäß der XML-Empfehlung ignoriert). Dies kannNonesein, wenn die Informationen nicht vom Parser bereitgestellt werden oder wenn keine Notationen definiert sind.
Document-Objekte¶
Ein Document repräsentiert ein gesamtes XML-Dokument, einschließlich seiner Bestandteile wie Elemente, Attribute, Verarbeitungsanweisungen, Kommentare usw. Denken Sie daran, dass es Eigenschaften von Node erbt.
- Document.documentElement¶
Das einzige Wurzelelement des Dokuments.
- Document.createElement(tagName)¶
Erstellt und gibt einen neuen Elementknoten zurück. Das Element wird beim Erstellen nicht in das Dokument eingefügt. Sie müssen es explizit mit einer der anderen Methoden wie
insertBefore()oderappendChild()einfügen.
- Document.createElementNS(namespaceURI, tagName)¶
Erstellt und gibt ein neues Element mit einem Namespace zurück. Der tagName kann ein Präfix haben. Das Element wird beim Erstellen nicht in das Dokument eingefügt. Sie müssen es explizit mit einer der anderen Methoden wie
insertBefore()oderappendChild()einfügen.
- Document.createTextNode(data)¶
Erstellt und gibt einen Textknoten zurück, der die als Parameter übergebenen Daten enthält. Wie bei den anderen Erstellungsmethoden fügt diese die Knoten nicht in den Baum ein.
- Document.createComment(data)¶
Erstellt und gibt einen Kommentar-Knoten zurück, der die als Parameter übergebenen Daten enthält. Wie bei den anderen Erstellungsmethoden fügt diese die Knoten nicht in den Baum ein.
- Document.createProcessingInstruction(target, data)¶
Erstellt und gibt einen Verarbeitungsanweisungs-Knoten zurück, der die als Parameter übergebenen target und data enthält. Wie bei den anderen Erstellungsmethoden fügt diese die Knoten nicht in den Baum ein.
- Document.createAttribute(name)¶
Erstellt und gibt einen Attributknoten zurück. Diese Methode ordnet den Attributknoten keinem bestimmten Element zu. Sie müssen
setAttributeNode()auf dem entsprechendenElement-Objekt verwenden, um die neu erstellte Attributinstanz zu verwenden.
- Document.createAttributeNS(namespaceURI, qualifiedName)¶
Erstellt und gibt einen Attributknoten mit einem Namespace zurück. Der tagName kann ein Präfix haben. Diese Methode ordnet den Attributknoten keinem bestimmten Element zu. Sie müssen
setAttributeNode()auf dem entsprechendenElement-Objekt verwenden, um die neu erstellte Attributinstanz zu verwenden.
- Document.getElementsByTagName(tagName)¶
Sucht nach allen Nachfahren (direkte Kinder, Kinder von Kindern usw.) mit einem bestimmten Elementtypnamen.
- Document.getElementsByTagNameNS(namespaceURI, localName)¶
Sucht nach allen Nachfahren (direkte Kinder, Kinder von Kindern usw.) mit einem bestimmten Namespace-URI und LocalName. Der LocalName ist der Teil des Namens nach dem Präfix.
Element-Objekte¶
Element ist eine Unterklasse von Node, erbt also alle Attribute dieser Klasse.
- Element.tagName¶
Der Elementtypname. In einem Namespace-verwendenden Dokument kann er Doppelpunkte enthalten. Der Wert ist ein String.
- Element.getElementsByTagName(tagName)¶
Gleich der gleichnamigen Methode in der
Document-Klasse.
- Element.getElementsByTagNameNS(namespaceURI, localName)¶
Gleich der gleichnamigen Methode in der
Document-Klasse.
- 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 dem Namespace-URI namespaceURI und dem LocalName localName hat.
- Element.getAttribute(name)¶
Gibt den Wert des Attributs mit dem Namen name als String zurück. Wenn kein solches Attribut existiert, wird ein leerer String zurückgegeben, als ob das Attribut keinen Wert hätte.
- Element.getAttributeNode(attrname)¶
Gibt den
Attr-Knoten für das Attribut mit dem Namen attrname zurück.
- Element.getAttributeNS(namespaceURI, localName)¶
Gibt den Wert des Attributs mit dem Namespace-URI namespaceURI und dem LocalName localName als String zurück. Wenn kein solches Attribut existiert, wird ein leerer String zurückgegeben, als ob das Attribut keinen Wert hätte.
- Element.getAttributeNodeNS(namespaceURI, localName)¶
Gibt einen Attributwert als Knoten zurück, gegeben einen namespaceURI und localName.
- Element.removeAttribute(name)¶
Entfernt ein Attribut anhand des Namens. Wenn kein passendes Attribut vorhanden ist, wird ein
NotFoundErrausgelöst.
- Element.removeAttributeNode(oldAttr)¶
Entfernt und gibt oldAttr aus der Attributliste zurück, falls vorhanden. Wenn oldAttr nicht vorhanden ist, wird ein
NotFoundErrausgelöst.
- Element.removeAttributeNS(namespaceURI, localName)¶
Entfernt ein Attribut anhand des Namens. Beachten Sie, dass hierfür ein LocalName und kein QName verwendet wird. Es wird keine Ausnahme ausgelöst, wenn kein passendes Attribut vorhanden ist.
- Element.setAttribute(name, value)¶
Setzt einen Attributwert aus einem String.
- Element.setAttributeNode(newAttr)¶
Fügt dem Element einen neuen Attributknoten hinzu und ersetzt gegebenenfalls ein vorhandenes Attribut, wenn der Attributname
nameübereinstimmt. Wenn eine Ersetzung stattfindet, wird der alte Attributknoten zurückgegeben. Wenn newAttr bereits in Gebrauch ist, wird einInuseAttributeErrausgelöst.
- Element.setAttributeNodeNS(newAttr)¶
Fügt dem Element einen neuen Attributknoten hinzu und ersetzt gegebenenfalls ein vorhandenes Attribut, wenn der Namespace-URI und der LocalName des Attributs übereinstimmen. Wenn eine Ersetzung stattfindet, wird der alte Attributknoten zurückgegeben. Wenn newAttr bereits in Gebrauch ist, wird ein
InuseAttributeErrausgelöst.
- Element.setAttributeNS(namespaceURI, qname, value)¶
Setzt einen Attributwert aus einem String, gegeben einen namespaceURI und einen qname. Beachten Sie, dass ein qname der gesamte Attributname ist. Dies ist anders als oben.
Attr-Objekte¶
Attr erbt von Node und erbt daher alle seine Attribute.
- Attr.name¶
Der Attributname. In einem Namespace-verwendenden Dokument kann er einen Doppelpunkt enthalten.
- Attr.localName¶
Der Teil des Namens nach dem Doppelpunkt, falls vorhanden, andernfalls der gesamte Name. Dies ist ein schreibgeschütztes Attribut.
- Attr.prefix¶
Der Teil des Namens vor dem Doppelpunkt, falls vorhanden, andernfalls der leere String.
- Attr.value¶
Der Textwert des Attributs. Dies ist ein Synonym für das Attribut
nodeValue.
NamedNodeMap-Objekte¶
NamedNodeMap erbt *nicht* von Node.
- NamedNodeMap.length¶
Die Länge der Attributliste.
- NamedNodeMap.item(index)¶
Gibt ein Attribut mit einem bestimmten Index zurück. Die Reihenfolge, in der die Attribute zurückgegeben werden, ist willkürlich, aber für die Lebensdauer eines DOM konsistent. Jedes Element ist ein Attributknoten. Sein Wert kann über das Attribut
valueabgerufen werden.
Es gibt auch experimentelle Methoden, die dieser Klasse mehr Mapping-Funktionen verleihen. Sie können diese verwenden oder die standardisierten getAttribute*()-Methoden auf den Element-Objekten verwenden.
Text- und CDATASection-Objekte¶
Die Schnittstelle Text repräsentiert Text im XML-Dokument. Wenn der Parser und die DOM-Implementierung die XML-Erweiterung des DOM unterstützen, werden Teile des Texts, die in CDATA-Markierungsabschnitten eingeschlossen sind, in CDATASection-Objekten gespeichert. Diese beiden Schnittstellen sind identisch, liefern aber unterschiedliche Werte für das Attribut nodeType.
Diese Schnittstellen erweitern die Node-Schnittstelle. Sie können keine Kindknoten haben.
- Text.data¶
Der Inhalt des Textknotens als String.
Hinweis
Die Verwendung eines CDATASection-Knotens zeigt nicht an, dass der Knoten einen vollständigen CDATA-Markierungsabschnitt darstellt, sondern nur, dass der Inhalt des Knotens Teil eines CDATA-Abschnitts war. Ein einzelner CDATA-Abschnitt kann durch mehr als einen Knoten im Dokumentbaum repräsentiert werden. Es gibt keine Möglichkeit festzustellen, ob zwei benachbarte CDATASection-Knoten unterschiedliche CDATA-Markierungsabschnitte darstellen.
ProcessingInstruction-Objekte¶
Repräsentiert eine Verarbeitungsanweisung im XML-Dokument; dies erbt von der Node-Schnittstelle und kann keine Kindknoten haben.
- ProcessingInstruction.target¶
Der Inhalt der Verarbeitungsanweisung bis zum ersten Leerzeichen. Dies ist ein schreibgeschütztes Attribut.
- ProcessingInstruction.data¶
Der Inhalt der Verarbeitungsanweisung nach dem ersten Leerzeichen.
Ausnahmen¶
Die DOM Level 2-Empfehlung definiert eine einzige Ausnahme, DOMException, und eine Reihe von Konstanten, die es Anwendungen ermöglichen, den aufgetretenen Fehlertyp zu ermitteln. DOMException-Instanzen enthalten ein Attribut code, das den entsprechenden Wert für die spezifische Ausnahme liefert.
Die Python DOM-Schnittstelle stellt die Konstanten bereit, erweitert aber auch die Menge der Ausnahmen, sodass für jeden von der DOM definierten Ausnahmecode eine spezifische Ausnahme existiert. Die Implementierungen müssen die entsprechende spezifische Ausnahme auslösen, die jeweils den richtigen Wert für das Attribut code enthält.
- exception xml.dom.DOMException¶
Basisklassen für Ausnahmen, die für alle spezifischen DOM-Ausnahmen verwendet werden. Diese Ausnahmeklasse kann nicht direkt instanziiert werden.
- exception xml.dom.DomstringSizeErr¶
Wird ausgelöst, wenn ein angegebener Textbereich nicht in einen String passt. Dies wird in den Python DOM-Implementierungen nicht verwendet, kann aber von DOM-Implementierungen empfangen werden, die nicht in Python geschrieben sind.
- exception xml.dom.HierarchyRequestErr¶
Wird ausgelöst, wenn versucht wird, einen Knoten einzufügen, wo der Knotentyp nicht erlaubt ist.
- exception xml.dom.IndexSizeErr¶
Wird ausgelöst, wenn ein Index- oder Größenparameter einer Methode negativ ist oder die zulässigen Werte überschreitet.
- exception xml.dom.InuseAttributeErr¶
Wird ausgelöst, wenn versucht wird, einen
Attr-Knoten einzufügen, der bereits an anderer Stelle im Dokument vorhanden ist.
- exception xml.dom.InvalidAccessErr¶
Wird ausgelöst, wenn ein Parameter oder eine Operation für das zugrunde liegende Objekt nicht unterstützt wird.
- exception xml.dom.InvalidCharacterErr¶
Diese Ausnahme wird ausgelöst, wenn ein String-Parameter ein Zeichen enthält, das im Kontext, in dem es von der XML 1.0-Empfehlung verwendet wird, nicht zulässig ist. Zum Beispiel wird der Versuch, einen
Element-Knoten mit einem Leerzeichen im Elementtypnamen zu erstellen, diesen Fehler auslösen.
- 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 verwendbar ist.
- exception xml.dom.NamespaceErr¶
Wenn versucht wird, ein Objekt so zu ändern, dass dies im Hinblick auf die Namespaces in XML-Empfehlung nicht zulässig ist, wird diese Ausnahme ausgelöst.
- exception xml.dom.NotFoundErr¶
Ausnahme, wenn ein Knoten im referenzierten Kontext nicht existiert. Zum Beispiel löst
NamedNodeMap.removeNamedItem()diesen Fehler aus, wenn der übergebene Knoten nicht in der Map vorhanden ist.
- exception xml.dom.NotSupportedErr¶
Wird ausgelöst, wenn die Implementierung den angeforderten Objekttyp oder die Operation nicht unterstützt.
- exception xml.dom.NoDataAllowedErr¶
Dies wird ausgelöst, wenn Daten für einen Knoten angegeben werden, der keine Daten unterstützt.
- exception xml.dom.NoModificationAllowedErr¶
Wird bei Versuchen ausgelöst, ein Objekt zu ändern, bei dem Änderungen nicht erlaubt sind (z. B. bei schreibgeschützten Knoten).
- exception xml.dom.SyntaxErr¶
Wird ausgelöst, wenn ein ungültiger oder illegaler String angegeben wird.
- exception xml.dom.WrongDocumentErr¶
Wird ausgelöst, wenn ein Knoten in ein anderes Dokument eingefügt wird, als zu dem er derzeit gehört, und die Implementierung das Verschieben des Knotens von einem Dokument zum anderen nicht unterstützt.
Die in der DOM-Empfehlung definierten Ausnahmecodes entsprechen den oben beschriebenen Ausnahmen gemäß dieser Tabelle
Konstante |
Exception |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Konformität¶
Dieser Abschnitt beschreibt die Konformitätsanforderungen und Beziehungen zwischen der Python DOM API, den W3C DOM-Empfehlungen und dem OMG IDL-Mapping für Python.
Typ-Mapping¶
Die in der DOM-Spezifikation verwendeten IDL-Typen werden gemäß der folgenden Tabelle Python-Typen zugeordnet.
IDL Typ |
Python Typ |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Accessor-Methoden¶
Das Mapping von OMG IDL zu Python definiert Accessor-Funktionen für IDL attribute-Deklarationen auf ähnliche Weise wie das Java-Mapping. Das Mapping der IDL-Deklarationen
readonly attribute string someValue;
attribute string anotherValue;
liefert drei Zugriffsfunktionen: eine „get“-Methode für someValue (_get_someValue()) und „get“- und „set“-Methoden für anotherValue (_get_anotherValue() und _set_anotherValue()). Insbesondere erfordert die Zuordnung nicht, dass die IDL-Attribute als normale Python-Attribute zugänglich sind: object.someValue muss nicht funktionieren und kann einen AttributeError auslösen.
Die Python DOM API erfordert jedoch, dass der normale Attributzugriff funktioniert. Das bedeutet, dass die typischen Stellvertreter, die von Python IDL-Compilern generiert werden, wahrscheinlich nicht funktionieren, und Wrapper-Objekte können auf der Clientseite benötigt werden, wenn die DOM-Objekte über CORBA aufgerufen werden. Obwohl dies einige zusätzliche Überlegungen für CORBA DOM-Clients erfordert, betrachten Implementierer mit Erfahrung in der Verwendung von DOM über CORBA von Python aus dies nicht als Problem. Attribute, die als readonly deklariert sind, schränken den Schreibzugriff möglicherweise nicht in allen DOM-Implementierungen ein.
In der Python DOM API sind Zugriffsfunktionen nicht erforderlich. Wenn sie bereitgestellt werden, sollten sie die vom Python IDL-Mapping definierte Form annehmen, aber diese Methoden werden als unnötig betrachtet, da die Attribute direkt von Python aus zugänglich sind. „Set“-Zugriffsfunktionen sollten niemals für readonly-Attribute bereitgestellt werden.
Die IDL-Definitionen verkörpern nicht vollständig die Anforderungen der W3C DOM API, wie die Vorstellung, dass bestimmte Objekte, wie der Rückgabewert von getElementsByTagName(), „live“ sind. Die Python DOM API verlangt von Implementierungen nicht, solche Anforderungen durchzusetzen.
Comment-Objekte¶
Commentrepräsentiert einen Kommentar im XML-Dokument. Es ist eine Unterklasse vonNode, kann aber keine Kindknoten haben.Der Inhalt des Kommentars als String. Das Attribut enthält alle Zeichen zwischen den führenden
<!--und den abschließenden-->, schließt diese aber nicht ein.