xml.dom.pulldom — Unterstützung für das Erstellen partieller DOM-Bäume

Quellcode: Lib/xml/dom/pulldom.py


Das Modul xml.dom.pulldom bietet einen „Pull-Parser“, der bei Bedarf auch DOM-zugängliche Fragmente des Dokuments erzeugen kann. Das Grundkonzept besteht darin, „Ereignisse“ aus einem Strom eingehender XML-Daten zu ziehen und diese zu verarbeiten. Im Gegensatz zu SAX, das ebenfalls ein ereignisgesteuertes Verarbeitungsmodell mit Rückrufen verwendet, ist der Benutzer eines Pull-Parsers dafür verantwortlich, die Ereignisse explizit aus dem Strom zu ziehen und über diese Ereignisse zu iterieren, bis entweder die Verarbeitung abgeschlossen ist oder eine Fehlerbedingung auftritt.

Hinweis

Wenn Sie nicht vertrauenswürdige oder nicht authentifizierte Daten parsen müssen, siehe XML-Sicherheit.

Geändert in Version 3.7.1: Der SAX-Parser verarbeitet standardmäßig keine allgemeinen externen Entitäten mehr, um die Sicherheit zu erhöhen. Um die Verarbeitung externer Entitäten zu aktivieren, übergeben Sie eine benutzerdefinierte Parser-Instanz in

from xml.dom.pulldom import parse
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, True)
parse(filename, parser=parser)

Beispiel

from xml.dom import pulldom

doc = pulldom.parse('sales_items.xml')
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'item':
        if int(node.getAttribute('price')) > 50:
            doc.expandNode(node)
            print(node.toxml())

event ist eine Konstante und kann einer der folgenden sein:

  • START_ELEMENT

  • END_ELEMENT

  • COMMENT

  • START_DOCUMENT

  • END_DOCUMENT

  • CHARACTERS

  • PROCESSING_INSTRUCTION

  • IGNORABLE_WHITESPACE

node ist ein Objekt vom Typ xml.dom.minidom.Document, xml.dom.minidom.Element oder xml.dom.minidom.Text.

Da das Dokument als „flacher“ Ereignisstrom behandelt wird, wird der Dokumentenbaum implizit durchlaufen und die gewünschten Elemente unabhängig von ihrer Tiefe im Baum gefunden. Mit anderen Worten, man muss sich keine hierarchischen Probleme wie die rekursive Suche nach Dokumentknoten machen, obwohl, wenn der Kontext von Elementen wichtig wäre, man entweder einen kontextbezogenen Zustand beibehalten müsste (d. h. sich merken, wo man sich gerade im Dokument befindet) oder die Methode DOMEventStream.expandNode() nutzen und zu DOM-bezogener Verarbeitung wechseln müsste.

class xml.dom.pulldom.PullDom(documentFactory=None)

Unterklasse von xml.sax.handler.ContentHandler.

class xml.dom.pulldom.SAX2DOM(documentFactory=None)

Unterklasse von xml.sax.handler.ContentHandler.

xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)

Gibt einen DOMEventStream aus dem gegebenen Input zurück. stream_or_string kann entweder ein Dateiname oder ein dateiähnliches Objekt sein. parser, falls angegeben, muss ein XMLReader-Objekt sein. Diese Funktion ändert den Dokumentenhandler des Parsers und aktiviert die Namensraumunterstützung; andere Parserkonfigurationen (wie das Setzen eines Entitätsauflösers) müssen im Voraus erfolgt sein.

Wenn Sie XML in einem String haben, können Sie stattdessen die Funktion parseString() verwenden.

xml.dom.pulldom.parseString(string, parser=None)

Gibt einen DOMEventStream zurück, der den (Unicode-) String darstellt.

xml.dom.pulldom.default_bufsize

Standardwert für den Parameter bufsize zu parse().

Der Wert dieser Variablen kann vor dem Aufruf von parse() geändert werden, und der neue Wert wird wirksam.

DOMEventStream-Objekte

class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)

Geändert in Version 3.11: Unterstützung für die Methode __getitem__() wurde entfernt.

getEvent()

Gibt ein Tupel zurück, das event und den aktuellen node als xml.dom.minidom.Document enthält, wenn event gleich START_DOCUMENT ist, xml.dom.minidom.Element, wenn event gleich START_ELEMENT oder END_ELEMENT ist, oder xml.dom.minidom.Text, wenn event gleich CHARACTERS ist. Der aktuelle Knoten enthält keine Informationen über seine Kinder, es sei denn, expandNode() wird aufgerufen.

expandNode(node)

Erweitert alle Kinder von node in node. Beispiel

from xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'
doc = pulldom.parseString(xml)
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'p':
        # Following statement only prints '<p/>'
        print(node.toxml())
        doc.expandNode(node)
        # Following statement prints node with all its children '<p>Some text <div>and more</div></p>'
        print(node.toxml())
reset()