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_ELEMENTEND_ELEMENTCOMMENTSTART_DOCUMENTEND_DOCUMENTCHARACTERSPROCESSING_INSTRUCTIONIGNORABLE_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
DOMEventStreamaus dem gegebenen Input zurück. stream_or_string kann entweder ein Dateiname oder ein dateiähnliches Objekt sein. parser, falls angegeben, muss einXMLReader-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
DOMEventStreamzurü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.Documententhält, wenn event gleichSTART_DOCUMENTist,xml.dom.minidom.Element, wenn event gleichSTART_ELEMENToderEND_ELEMENTist, oderxml.dom.minidom.Text, wenn event gleichCHARACTERSist. 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()¶