xml.parsers.expat — Schnelles XML-Parsing mit Expat¶
Hinweis
Wenn Sie nicht vertrauenswürdige oder nicht authentifizierte Daten parsen müssen, siehe XML-Sicherheit.
Das Modul xml.parsers.expat ist eine Python-Schnittstelle zum nicht-validierenden XML-Parser Expat. Das Modul stellt einen einzigen Erweiterungstyp, xmlparser, zur Verfügung, der den aktuellen Zustand eines XML-Parsers repräsentiert. Nach der Erstellung eines xmlparser-Objekts können verschiedene Attribute des Objekts auf Handler-Funktionen gesetzt werden. Wenn dann ein XML-Dokument an den Parser übergeben wird, werden die Handler-Funktionen für die Zeichen- und Markupdaten im XML-Dokument aufgerufen.
Dieses Modul verwendet das Modul pyexpat, um Zugriff auf den Expat-Parser zu gewähren. Die direkte Verwendung des Moduls pyexpat ist veraltet.
Dieses Modul stellt eine Ausnahme und ein Typobjekt bereit
- exception xml.parsers.expat.ExpatError¶
Die Ausnahme, die ausgelöst wird, wenn Expat einen Fehler meldet. Siehe Abschnitt ExpatError Ausnahmen für weitere Informationen zur Interpretation von Expat-Fehlern.
- exception xml.parsers.expat.error¶
Alias für
ExpatError.
- xml.parsers.expat.XMLParserType¶
Der Typ der Rückgabewerte der Funktion
ParserCreate().
Das Modul xml.parsers.expat enthält zwei Funktionen
- xml.parsers.expat.ErrorString(errno)¶
Gibt eine erklärende Zeichenkette für eine gegebene Fehlernummer errno zurück.
- xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None)¶
Erstellt und gibt ein neues
xmlparser-Objekt zurück. encoding, falls angegeben, muss eine Zeichenkette sein, die die vom XML-Datensatz verwendete Kodierung benennt. Expat unterstützt nicht so viele Kodierungen wie Python, und sein Repertoire an Kodierungen kann nicht erweitert werden; es unterstützt UTF-8, UTF-16, ISO-8859-1 (Latin1) und ASCII. Wenn encoding [1] angegeben wird, überschreibt dies die implizite oder explizite Kodierung des Dokuments.Expat kann optional die XML-Namespace-Verarbeitung für Sie durchführen, was durch Angabe eines Wertes für namespace_separator aktiviert wird. Der Wert muss eine ein-Zeichen-Zeichenkette sein; ein
ValueErrorwird ausgelöst, wenn die Zeichenkette eine illegale Länge hat (Nonewird als gleichbedeutend mit Weglassen betrachtet). Wenn die Namespace-Verarbeitung aktiviert ist, werden Elementtyp- und Attributnamen, die zu einem Namespace gehören, erweitert. Der an die Element-HandlerStartElementHandlerundEndElementHandlerübergebene Elementname ist die Verkettung der Namespace-URI, des Namespace-Trennzeichens und des lokalen Teils des Namens. Wenn das Namespace-Trennzeichen ein Null-Byte (chr(0)) ist, werden die Namespace-URI und der lokale Teil ohne Trennzeichen verkettet.Zum Beispiel, wenn namespace_separator auf ein Leerzeichen (
' ') gesetzt wird und das folgende Dokument geparst wird<?xml version="1.0"?> <root xmlns = "http://default-namespace.org/" xmlns:py = "https://pythonlang.de/ns/"> <py:elem1 /> <elem2 xmlns="" /> </root>
StartElementHandlererhält für jedes Element die folgenden Zeichenkettenhttp://default-namespace.org/ root http://www.python.org/ns/ elem1 elem2
Aufgrund von Einschränkungen in der
Expat-Bibliothek, die vonpyexpatverwendet wird, kann die zurückgegebenexmlparser-Instanz nur zum Parsen eines einzigen XML-Dokuments verwendet werden. Rufen SieParserCreatefür jedes Dokument auf, um eindeutige Parser-Instanzen bereitzustellen.
Siehe auch
- Der Expat XML-Parser
Startseite des Expat-Projekts.
XMLParser-Objekte¶
xmlparser-Objekte haben die folgenden Methoden
- xmlparser.Parse(data[, isfinal])¶
Parst den Inhalt der Zeichenkette data und ruft die entsprechenden Handler-Funktionen auf, um die geparsten Daten zu verarbeiten. isfinal muss bei der letzten Aufruf dieser Methode
Truesein; dies ermöglicht das Parsen einer einzelnen Datei in Fragmenten, nicht die Übergabe mehrerer Dateien. data kann jederzeit die leere Zeichenkette sein.
- xmlparser.ParseFile(file)¶
Parst XML-Daten aus dem Objekt file. file muss nur die Methode
read(nbytes)bereitstellen und die leere Zeichenkette zurückgeben, wenn keine Daten mehr vorhanden sind.
- xmlparser.SetBase(base)¶
Legt die Basis fest, die zur Auflösung relativer URIs in Systembezeichnern in Deklarationen verwendet wird. Die Auflösung relativer Bezeichner wird der Anwendung überlassen: Dieser Wert wird als base-Argument an die Funktionen
ExternalEntityRefHandler(),NotationDeclHandler()undUnparsedEntityDeclHandler()weitergegeben.
- xmlparser.GetBase()¶
Gibt eine Zeichenkette zurück, die die Basis enthält, die durch einen vorherigen Aufruf von
SetBase()gesetzt wurde, oderNone, wennSetBase()nicht aufgerufen wurde.
- xmlparser.GetInputContext()¶
Gibt die Eingabedaten, die das aktuelle Ereignis generiert haben, als Zeichenkette zurück. Die Daten liegen in der Kodierung der Entität vor, die den Text enthält. Wenn sie außerhalb eines Ereignis-Handlers aufgerufen wird, ist der Rückgabewert
None.
- xmlparser.ExternalEntityParserCreate(context[, encoding])¶
Erstellt einen "Kind"-Parser, der zum Parsen einer externen geparsten Entität verwendet werden kann, auf die durch vom übergeordneten Parser geparsten Inhalt verwiesen wird. Der Parameter context sollte die an die Handler-Funktion
ExternalEntityRefHandler()übergebene Zeichenkette sein, die unten beschrieben wird. Der Kind-Parser wird mit den Wertenordered_attributesundspecified_attributesdieses Parsers erstellt.
- xmlparser.SetParamEntityParsing(flag)¶
Steuert das Parsen von Parameter-Entitäten (einschließlich des externen DTD-Subsets). Mögliche Werte für flag sind
XML_PARAM_ENTITY_PARSING_NEVER,XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEundXML_PARAM_ENTITY_PARSING_ALWAYS. GibtTruezurück, wenn das Setzen des Flags erfolgreich war.
- xmlparser.UseForeignDTD([flag])¶
Der Aufruf mit einem wahren Wert für flag (der Standardwert) bewirkt, dass Expat den Handler
ExternalEntityRefHandlermitNonefür alle Argumente aufruft, um das Laden einer alternativen DTD zu ermöglichen. Wenn das Dokument keine Dokumenttyp-Deklaration enthält, wird der HandlerExternalEntityRefHandlertrotzdem aufgerufen, aber die HandlerStartDoctypeDeclHandlerundEndDoctypeDeclHandlerwerden nicht aufgerufen.Das Übergeben eines falschen Wertes für flag bricht einen vorherigen Aufruf, der einen wahren Wert übergab, ab, hat aber ansonsten keine Auswirkung.
Diese Methode kann nur aufgerufen werden, bevor die Methoden
Parse()oderParseFile()aufgerufen werden; der Aufruf nach dem Aufruf einer dieser Methoden löst eineExpatErroraus, wobei das Attributcodeauferrors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]gesetzt wird.
- xmlparser.SetReparseDeferralEnabled(enabled)¶
Warnung
Der Aufruf von
SetReparseDeferralEnabled(False)hat Sicherheitsimplikationen, wie unten detailliert beschrieben; stellen Sie sicher, dass Sie diese Konsequenzen verstehen, bevor Sie die MethodeSetReparseDeferralEnabledverwenden.Expat 2.6.0 führte einen Sicherheitsmechanismus namens "Reparse Deferral" ein, bei dem anstelle einer Denial-of-Service-Attacke durch quadratische Laufzeit durch erneutes Parsen großer Token, das erneute Parsen unvollständiger Token nun standardmäßig verzögert wird, bis eine ausreichende Menge an Eingaben erreicht ist. Aufgrund dieser Verzögerung können registrierte Handler – abhängig von der Größe der an Expat übergebenen Eingabe-Chunks – möglicherweise nicht sofort nach der Übergabe neuer Eingaben an den Parser aufgerufen werden. Wo sofortiges Feedback und die Übernahme der Verantwortung für den Schutz vor Denial-of-Service-Attacken durch große Token gewünscht sind, deaktiviert der Aufruf von
SetReparseDeferralEnabled(False)das erneute Parsen für die aktuelle Expat-Parser-Instanz, vorübergehend oder endgültig. Der Aufruf vonSetReparseDeferralEnabled(True)ermöglicht die erneute Aktivierung des erneuten Parsens.Beachten Sie, dass
SetReparseDeferralEnabled()in einige frühere Versionen von CPython als Sicherheitsfix zurückportiert wurde. Prüfen Sie die Verfügbarkeit vonSetReparseDeferralEnabled()mithasattr(), wenn Sie Code verwenden, der über verschiedene Python-Versionen läuft.Hinzugefügt in Version 3.13.
- xmlparser.GetReparseDeferralEnabled()¶
Gibt zurück, ob das erneute Parsen für die gegebene Expat-Parser-Instanz derzeit aktiviert ist.
Hinzugefügt in Version 3.13.
xmlparser-Objekte haben die folgenden Attribute
- xmlparser.buffer_size¶
Die Größe des Puffers, der verwendet wird, wenn
buffer_textwahr ist. Eine neue Puffergröße kann durch Zuweisung eines neuen ganzzahligen Wertes zu diesem Attribut gesetzt werden. Wenn die Größe geändert wird, wird der Puffer geleert.
- xmlparser.buffer_text¶
Wenn dieser Wert auf
Truegesetzt wird, puffert dasxmlparser-Objekt Textinhalte, die von Expat zurückgegeben werden, um mehrere Aufrufe des CallbacksCharacterDataHandler()zu vermeiden, wo immer möglich. Dies kann die Leistung erheblich verbessern, da Expat normalerweise Zeichendaten bei jeder Zeilenendung in Blöcke aufteilt. Dieses Attribut ist standardmäßig falsch und kann jederzeit geändert werden. Beachten Sie, dass Daten, die keine Zeilenumbrüche enthalten, auch zerstückelt werden können, wenn es falsch ist.
- xmlparser.buffer_used¶
Wenn
buffer_textaktiviert ist, die Anzahl der im Puffer gespeicherten Bytes. Diese Bytes repräsentieren UTF-8-kodierten Text. Dieses Attribut hat keine sinnvolle Interpretation, wennbuffer_textfalsch ist.
- xmlparser.ordered_attributes¶
Das Setzen dieses Attributs auf eine nicht-null Ganzzahl bewirkt, dass die Attribute als Liste anstelle eines Dictionaries gemeldet werden. Die Attribute werden in der Reihenfolge präsentiert, in der sie im Dokumenttext gefunden wurden. Für jedes Attribut werden zwei Listeneinträge präsentiert: der Attributname und der Attributwert. (Ältere Versionen dieses Moduls verwendeten ebenfalls dieses Format.) Standardmäßig ist dieses Attribut falsch; es kann jederzeit geändert werden.
- xmlparser.specified_attributes¶
Wenn auf eine nicht-null Ganzzahl gesetzt, meldet der Parser nur die Attribute, die in der Dokumentinstanz angegeben wurden, und nicht diejenigen, die aus Attributdeklarationen abgeleitet wurden. Anwendungen, die dies setzen, müssen besonders darauf achten, welche zusätzlichen Informationen aus den Deklarationen wie benötigt verwendet werden, um die Standards für das Verhalten von XML-Prozessoren einzuhalten. Standardmäßig ist dieses Attribut falsch; es kann jederzeit geändert werden.
Die folgenden Attribute enthalten Werte, die sich auf den letzten aufgetretenen Fehler eines xmlparser-Objekts beziehen, und haben nur korrekte Werte, sobald ein Aufruf von Parse() oder ParseFile() eine xml.parsers.expat.ExpatError-Ausnahme ausgelöst hat.
- xmlparser.ErrorByteIndex¶
Byte-Index, an dem ein Fehler aufgetreten ist.
- xmlparser.ErrorCode¶
Numerischer Code, der das Problem spezifiziert. Dieser Wert kann an die Funktion
ErrorString()übergeben oder mit einer der Konstanten verglichen werden, die im Objekterrorsdefiniert sind.
- xmlparser.ErrorColumnNumber¶
Spaltennummer, an der ein Fehler aufgetreten ist.
- xmlparser.ErrorLineNumber¶
Zeilennummer, an der ein Fehler aufgetreten ist.
Die folgenden Attribute enthalten Werte, die sich auf die aktuelle Parse-Position in einem xmlparser-Objekt beziehen. Während eines Callbacks, der ein Parse-Ereignis meldet, geben sie die Position des ersten Zeichens der Sequenz an, das das Ereignis erzeugt hat. Wenn außerhalb eines Callbacks aufgerufen, zeigt die angezeigte Position direkt nach dem letzten Parse-Ereignis an (unabhängig davon, ob ein zugehöriger Callback vorhanden war).
- xmlparser.CurrentByteIndex¶
Aktueller Byte-Index in der Parser-Eingabe.
- xmlparser.CurrentColumnNumber¶
Aktuelle Spaltennummer in der Parser-Eingabe.
- xmlparser.CurrentLineNumber¶
Aktuelle Zeilennummer in der Parser-Eingabe.
Hier ist die Liste der Handler, die gesetzt werden können. Um einen Handler für ein xmlparser-Objekt o zu setzen, verwenden Sie o.handlername = func. handlername muss aus der folgenden Liste stammen, und func muss ein aufrufbares Objekt sein, das die korrekte Anzahl von Argumenten akzeptiert. Die Argumente sind alle Zeichenketten, sofern nicht anders angegeben.
- xmlparser.XmlDeclHandler(version, encoding, standalone)¶
Wird aufgerufen, wenn die XML-Deklaration geparst wird. Die XML-Deklaration ist die (optionale) Deklaration der anwendbaren Version der XML-Empfehlung, der Kodierung des Dokumenttextes und einer optionalen "standalone"-Deklaration. version und encoding sind Zeichenketten, und standalone ist
1, wenn das Dokument als standalone deklariert ist,0, wenn es als nicht-standalone deklariert ist, oder-1, wenn die standalone-Klausel weggelassen wurde. Dies ist nur mit Expat-Version 1.95.0 oder neuer verfügbar.
- xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)¶
Wird aufgerufen, wenn Expat mit dem Parsen der Dokumenttyp-Deklaration (
<!DOCTYPE ...) beginnt. doctypeName wird genau so bereitgestellt, wie er erscheint. Die Parameter systemId und publicId geben die System- und Public-Identifier an, falls sie angegeben sind, oderNone, falls sie weggelassen wurden. has_internal_subset istTrue, wenn das Dokument ein internes Dokument-Deklarations-Subset enthält. Dies erfordert Expat-Version 1.2 oder neuer.
- xmlparser.EndDoctypeDeclHandler()¶
Wird aufgerufen, wenn Expat mit dem Parsen der Dokumenttyp-Deklaration fertig ist. Dies erfordert Expat-Version 1.2 oder neuer.
- xmlparser.ElementDeclHandler(name, model)¶
Wird einmal für jede Elementtyp-Deklaration aufgerufen. name ist der Name des Elementtyps, und model ist eine Darstellung des Inhaltsmodells.
- xmlparser.AttlistDeclHandler(elname, attname, type, default, required)¶
Wird für jedes deklarierte Attribut eines Elementtyps aufgerufen. Wenn eine Attributlisten-Deklaration drei Attribute deklariert, wird dieser Handler dreimal aufgerufen, einmal für jedes Attribut. elname ist der Name des Elements, für das die Deklaration gilt, und attname ist der Name des deklarierten Attributs. Der Attributtyp ist eine Zeichenkette, die als type übergeben wird; die möglichen Werte sind
'CDATA','ID','IDREF', ... default gibt den Standardwert für das Attribut an, der verwendet wird, wenn das Attribut nicht in der Dokumentinstanz angegeben ist, oderNone, wenn kein Standardwert vorhanden ist (#IMPLIEDWerte). Wenn das Attribut in der Dokumentinstanz obligatorisch angegeben werden muss, ist requiredTrue. Dies erfordert Expat-Version 1.95.0 oder neuer.
- xmlparser.StartElementHandler(name, attributes)¶
Wird für den Beginn jedes Elements aufgerufen. name ist eine Zeichenkette, die den Elementnamen enthält, und attributes sind die Elementattribute. Wenn
ordered_attributeswahr ist, ist dies eine Liste (sieheordered_attributesfür eine vollständige Beschreibung). Andernfalls ist es ein Dictionary, das Namen auf Werte abbildet.
- xmlparser.EndElementHandler(name)¶
Wird für das Ende jedes Elements aufgerufen.
- xmlparser.ProcessingInstructionHandler(target, data)¶
Wird für jede Verarbeitungsanweisung aufgerufen.
- xmlparser.CharacterDataHandler(data)¶
Wird für Zeichendaten aufgerufen. Dies wird für normale Zeichendaten, CDATA-markierten Inhalt und ignorable Leerzeichen aufgerufen. Anwendungen, die diese Fälle unterscheiden müssen, können die Callbacks
StartCdataSectionHandler,EndCdataSectionHandlerundElementDeclHandlerverwenden, um die erforderlichen Informationen zu sammeln. Beachten Sie, dass die Zeichendaten auch dann zerstückelt werden können, wenn sie kurz sind, sodass Sie mehr als einen Aufruf vonCharacterDataHandler()erhalten können. Setzen Sie das Instanzattributbuffer_textaufTrue, um dies zu vermeiden.
- xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)¶
Wird für nicht geparste (NDATA) Entitätendeklarationen aufgerufen. Dies ist nur für Version 1.2 der Expat-Bibliothek vorhanden; für neuere Versionen verwenden Sie stattdessen
EntityDeclHandler. (Die zugrunde liegende Funktion in der Expat-Bibliothek wurde als veraltet deklariert.)
- xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)¶
Wird für alle Entitätendeklarationen aufgerufen. Für Parameter- und interne Entitäten ist value eine Zeichenkette, die den deklarierten Inhalt der Entität angibt; dies ist
Nonefür externe Entitäten. Der Parameter notationName istNonefür geparste Entitäten und der Name der Notation für nicht geparste Entitäten. is_parameter_entity istTrue, wenn die Entität eine Parameter-Entität ist, oder falsch für allgemeine Entitäten (die meisten Anwendungen müssen sich nur mit allgemeinen Entitäten befassen). Dies ist erst ab Version 1.95.0 der Expat-Bibliothek verfügbar.
- xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)¶
Wird für Notationsdeklarationen aufgerufen. notationName, base und systemId sowie publicId sind Zeichenketten, falls angegeben. Wenn die Public-Identifier weggelassen werden, ist publicId
None.
- xmlparser.StartNamespaceDeclHandler(prefix, uri)¶
Wird aufgerufen, wenn ein Element eine Namespace-Deklaration enthält. Namespace-Deklarationen werden verarbeitet, bevor der
StartElementHandlerfür das Element, auf dem die Deklarationen platziert sind, aufgerufen wird.
- xmlparser.EndNamespaceDeclHandler(prefix)¶
Wird aufgerufen, wenn das schließende Tag für ein Element erreicht wird, das eine Namespace-Deklaration enthielt. Dies wird einmal für jede Namespace-Deklaration auf dem Element in umgekehrter Reihenfolge aufgerufen, in der der
StartNamespaceDeclHandleraufgerufen wurde, um den Beginn des Gültigkeitsbereichs jeder Namespace-Deklaration anzuzeigen. Aufrufe an diesen Handler erfolgen nach dem entsprechendenEndElementHandlerfür das Ende des Elements.
- xmlparser.CommentHandler(data)¶
Wird für Kommentare aufgerufen. data ist der Text des Kommentars, ausschließlich der führenden
'<!--'und des abschließenden'-->'.
- xmlparser.StartCdataSectionHandler()¶
Wird zu Beginn eines CDATA-Abschnitts aufgerufen. Dies und der
EndCdataSectionHandlersind erforderlich, um den syntaktischen Anfang und das Ende von CDATA-Abschnitten identifizieren zu können.
- xmlparser.EndCdataSectionHandler()¶
Wird am Ende eines CDATA-Abschnitts aufgerufen.
- xmlparser.DefaultHandler(data)¶
Wird für beliebige Zeichen im XML-Dokument aufgerufen, für die kein anwendbarer Handler angegeben wurde. Das bedeutet, Zeichen, die Teil einer zu meldenden Konstruktion sind, für die jedoch kein Handler bereitgestellt wurde.
- xmlparser.DefaultHandlerExpand(data)¶
Dies ist dasselbe wie der
DefaultHandler(), verhindert jedoch nicht die Erweiterung interner Entitäten. Die Entitätsreferenz wird nicht an den Standardhandler übergeben.
- xmlparser.NotStandaloneHandler()¶
Wird aufgerufen, wenn das XML-Dokument nicht als eigenständiges Dokument deklariert wurde. Dies geschieht, wenn ein externer Subset oder eine Referenz auf eine Parameter-Entität vorhanden ist, aber die XML-Deklaration nicht auf
yesin einer XML-Deklaration gesetzt ist. Wenn dieser Handler0zurückgibt, löst der Parser einenXML_ERROR_NOT_STANDALONEFehler aus. Wenn dieser Handler nicht gesetzt ist, wird für diesen Zustand kein Fehler vom Parser ausgelöst.
- xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)¶
Wird für Referenzen auf externe Entitäten aufgerufen. base ist die aktuelle Basis, wie sie durch einen früheren Aufruf von
SetBase()gesetzt wurde. Die öffentlichen und systembezogenen Bezeichner, systemId und publicId, sind Zeichenketten, wenn sie gegeben sind; wenn der öffentliche Bezeichner nicht gegeben ist, ist publicIdNone. Der Wert context ist undurchsichtig und sollte nur wie unten beschrieben verwendet werden.Damit externe Entitäten geparst werden können, muss dieser Handler implementiert sein. Er ist für die Erstellung des Unter-Parsers mit
ExternalEntityParserCreate(context), dessen Initialisierung mit den entsprechenden Rückrufen und das Parsen der Entität verantwortlich. Dieser Handler sollte eine Ganzzahl zurückgeben; wenn er0zurückgibt, löst der Parser einenXML_ERROR_EXTERNAL_ENTITY_HANDLINGFehler aus, andernfalls wird das Parsen fortgesetzt.Wenn dieser Handler nicht bereitgestellt wird, werden externe Entitäten vom
DefaultHandler-Callback gemeldet, sofern dieser bereitgestellt wird.
ExpatError-Ausnahmen¶
ExpatError-Ausnahmen haben eine Reihe interessanter Attribute
- ExpatError.code¶
Expats interner Fehlercode für den spezifischen Fehler. Das Wörterbuch
errors.messagesordnet diese Fehlercodes den Fehlermeldungen von Expat zu. Zum Beispielfrom xml.parsers.expat import ParserCreate, ExpatError, errors p = ParserCreate() try: p.Parse(some_xml_document) except ExpatError as err: print("Error:", errors.messages[err.code])
Das Modul
errorsstellt auch Fehlermeldungskonstanten und ein Wörterbuchcodeszur Verfügung, das diese Meldungen zurück auf die Fehlercodes abbildet, siehe unten.
- ExpatError.lineno¶
Zeilennummer, in der der Fehler erkannt wurde. Die erste Zeile wird mit
1nummeriert.
- ExpatError.offset¶
Zeichenversatz innerhalb der Zeile, an dem der Fehler aufgetreten ist. Die erste Spalte wird mit
0nummeriert.
Beispiel¶
Das folgende Programm definiert drei Handler, die einfach ihre Argumente ausgeben.
import xml.parsers.expat
# 3 handler functions
def start_element(name, attrs):
print('Start element:', name, attrs)
def end_element(name):
print('End element:', name)
def char_data(data):
print('Character data:', repr(data))
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
Die Ausgabe dieses Programms lautet
Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
Content Model Descriptions¶
Inhaltsmodelle werden mit verschachtelten Tupeln beschrieben. Jedes Tupel enthält vier Werte: den Typ, den Quantifizierer, den Namen und ein Tupel von Kindern. Kinder sind einfach zusätzliche Beschreibungen von Inhaltsmodellen.
Die Werte der ersten beiden Felder sind Konstanten, die im Modul xml.parsers.expat.model definiert sind. Diese Konstanten können in zwei Gruppen gesammelt werden: die Gruppe der Modelltypen und die Gruppe der Quantifizierer.
Die Konstanten in der Gruppe der Modelltypen sind
- xml.parsers.expat.model.XML_CTYPE_ANY
Das Element mit dem Modellnamen wurde so deklariert, dass es ein Inhaltsmodell von
ANYhat.
- xml.parsers.expat.model.XML_CTYPE_CHOICE
Das benannte Element erlaubt eine Auswahl aus einer Reihe von Optionen; dies wird für Inhaltsmodelle wie
(A | B | C)verwendet.
- xml.parsers.expat.model.XML_CTYPE_EMPTY
Elemente, die als
EMPTYdeklariert sind, haben diesen Modelltyp.
- xml.parsers.expat.model.XML_CTYPE_MIXED
- xml.parsers.expat.model.XML_CTYPE_NAME
- xml.parsers.expat.model.XML_CTYPE_SEQ
Modelle, die eine Serie von Modellen darstellen, die nacheinander folgen, werden mit diesem Modelltyp angegeben. Dies wird für Modelle wie
(A, B, C)verwendet.
Die Konstanten in der Quantifizierer-Gruppe sind
- xml.parsers.expat.model.XML_CQUANT_NONE
Es wird kein Modifikator angegeben, daher kann es genau einmal vorkommen, wie bei
A.
- xml.parsers.expat.model.XML_CQUANT_OPT
Das Modell ist optional: es kann einmal oder gar nicht vorkommen, wie bei
A?.
- xml.parsers.expat.model.XML_CQUANT_PLUS
Das Modell muss ein- oder mehrmals vorkommen (wie
A+).
- xml.parsers.expat.model.XML_CQUANT_REP
Das Modell muss null- oder mehrmals vorkommen, wie bei
A*.
Expat-Fehlerkonstanten¶
Die folgenden Konstanten sind im Modul xml.parsers.expat.errors enthalten. Diese Konstanten sind nützlich für die Interpretation einiger Attribute der ExpatError-Ausnahmeobjekte, die ausgelöst werden, wenn ein Fehler aufgetreten ist. Da aus Gründen der Abwärtskompatibilität der Wert der Konstanten die Fehlermeldung und nicht der numerische Fehlercode ist, geschieht dies, indem sein code-Attribut mit errors.codes[errors.XML_ERROR_CONSTANT_NAME] verglichen wird.
Das Modul errors hat die folgenden Attribute
- xml.parsers.expat.errors.codes¶
Ein Wörterbuch, das Zeichenkettenbeschreibungen ihren Fehlercodes zuordnet.
Hinzugefügt in Version 3.2.
- xml.parsers.expat.errors.messages¶
Ein Wörterbuch, das numerische Fehlercodes ihren Zeichenkettenbeschreibungen zuordnet.
Hinzugefügt in Version 3.2.
- xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY¶
- xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF¶
Eine Entitätsreferenz in einem Attributwert verwies auf eine externe Entität anstelle einer internen Entität.
- xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF¶
Eine Zeichenreferenz verwies auf ein Zeichen, das in XML ungültig ist (z. B. Zeichen
0oder '�').
- xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF¶
Eine Entitätsreferenz verwies auf eine Entität, die mit einer Notation deklariert war und daher nicht geparst werden konnte.
- xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE¶
Ein Attribut wurde in einem Start-Tag mehr als einmal verwendet.
- xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING¶
- xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN¶
Ausgelöst, wenn ein Eingabebyt nicht korrekt einem Zeichen zugeordnet werden konnte; zum Beispiel ein NUL-Byte (Wert
0) in einem UTF-8-Eingabestrom.
- xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT¶
Nach dem Dokumentenelement trat etwas anderes als Whitespace auf.
- xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI¶
Eine XML-Deklaration wurde an einer anderen Stelle als am Anfang der Eingabedaten gefunden.
- xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS¶
Das Dokument enthält keine Elemente (XML erfordert, dass alle Dokumente genau ein Oberflächenelement enthalten).
- xml.parsers.expat.errors.XML_ERROR_NO_MEMORY¶
Expat konnte intern keinen Speicher zuweisen.
- xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF¶
Eine Parameter-Entitätsreferenz wurde gefunden, wo sie nicht erlaubt war.
- xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR¶
Ein unvollständiges Zeichen wurde in der Eingabe gefunden.
- xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF¶
Eine Entitätsreferenz enthielt eine weitere Referenz auf dieselbe Entität; möglicherweise über einen anderen Namen und möglicherweise indirekt.
- xml.parsers.expat.errors.XML_ERROR_SYNTAX¶
Ein nicht spezifizierter Syntaxfehler wurde festgestellt.
- xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH¶
Ein End-Tag stimmte nicht mit dem innersten offenen Start-Tag überein.
- xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN¶
Ein Token (z. B. ein Start-Tag) wurde nicht vor dem Ende des Streams geschlossen, oder das nächste Token wurde angetroffen.
- xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY¶
Es wurde auf eine nicht definierte Entität verwiesen.
- xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING¶
Die Dokumentenkodierung wird von Expat nicht unterstützt.
- xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION¶
Ein CDATA-markierter Abschnitt wurde nicht geschlossen.
- xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING¶
- xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE¶
Der Parser hat festgestellt, dass das Dokument nicht „standalone“ war, obwohl es sich in der XML-Deklaration als solches deklariert hat, und der
NotStandaloneHandlergesetzt war und0zurückgegeben hat.
- xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE¶
- xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE¶
- xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD¶
Eine Operation wurde angefordert, die die Kompilierung der DTD-Unterstützung erfordert, aber Expat wurde ohne DTD-Unterstützung konfiguriert. Dies sollte niemals von einem Standard-Build des Moduls
xml.parsers.expatgemeldet werden.
- xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING¶
Eine Verhaltensänderung wurde nach Beginn des Parsens angefordert, die nur vor Beginn des Parsens geändert werden kann. Dies wird (derzeit) nur von
UseForeignDTD()ausgelöst.
- xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX¶
Ein nicht deklarierter Präfix wurde gefunden, als die Namespace-Verarbeitung aktiviert war.
- xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX¶
Das Dokument versuchte, die Namespace-Deklaration für einen Präfix zu entfernen.
- xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE¶
Eine Parameter-Entität enthielt unvollständige Markup.
- xml.parsers.expat.errors.XML_ERROR_XML_DECL¶
Das Dokument enthielt überhaupt kein Dokumentenelement.
- xml.parsers.expat.errors.XML_ERROR_TEXT_DECL¶
Beim Parsen einer Textdeklaration in einer externen Entität gab es einen Fehler.
- xml.parsers.expat.errors.XML_ERROR_PUBLICID¶
Im öffentlichen Bezeichner wurden Zeichen gefunden, die nicht zulässig sind.
- xml.parsers.expat.errors.XML_ERROR_SUSPENDED¶
Der angeforderte Vorgang wurde für einen angehaltenen Parser ausgeführt, ist aber nicht erlaubt. Dies schließt Versuche ein, zusätzliche Eingaben bereitzustellen oder den Parser zu stoppen.
- xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED¶
Es wurde versucht, den Parser fortzusetzen, obwohl er nicht angehalten war.
- xml.parsers.expat.errors.XML_ERROR_ABORTED¶
Dies sollte Python-Anwendungen nicht gemeldet werden.
- xml.parsers.expat.errors.XML_ERROR_FINISHED¶
Der angeforderte Vorgang wurde für einen Parser ausgeführt, der das Parsen von Eingaben beendet hat, ist aber nicht erlaubt. Dies schließt Versuche ein, zusätzliche Eingaben bereitzustellen oder den Parser zu stoppen.
- xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE¶
- xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML¶
Es wurde versucht, den reservierten Namespace-Präfix
xmlzu deklarieren oder ihn an eine andere Namespace-URI zu binden.
- xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS¶
Es wurde versucht, den reservierten Namespace-Präfix
xmlnszu deklarieren oder zu deklarieren.
- xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI¶
Es wurde versucht, die URI eines der reservierten Namespace-Präfixe
xmlundxmlnsan einen anderen Namespace-Präfix zu binden.
- xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT¶
Dies sollte Python-Anwendungen nicht gemeldet werden.
- xml.parsers.expat.errors.XML_ERROR_NO_BUFFER¶
Dies sollte Python-Anwendungen nicht gemeldet werden.
- xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH¶
Das Limit für den Eingabeverstärkungsfaktor (aus DTD und Entitäten) wurde überschritten.
- xml.parsers.expat.errors.XML_ERROR_NOT_STARTED¶
Es wurde versucht, den Parser zu stoppen oder anzuhalten, bevor er gestartet wurde.
Hinzugefügt in Version 3.14.
Fußnoten