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 ValueError wird ausgelöst, wenn die Zeichenkette eine illegale Länge hat (None wird 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-Handler StartElementHandler und EndElementHandler ü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>

StartElementHandler erhält für jedes Element die folgenden Zeichenketten

http://default-namespace.org/ root
http://www.python.org/ns/ elem1
elem2

Aufgrund von Einschränkungen in der Expat-Bibliothek, die von pyexpat verwendet wird, kann die zurückgegebene xmlparser-Instanz nur zum Parsen eines einzigen XML-Dokuments verwendet werden. Rufen Sie ParserCreate fü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 True sein; 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() und UnparsedEntityDeclHandler() weitergegeben.

xmlparser.GetBase()

Gibt eine Zeichenkette zurück, die die Basis enthält, die durch einen vorherigen Aufruf von SetBase() gesetzt wurde, oder None, wenn SetBase() 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 Werten ordered_attributes und specified_attributes dieses 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_STANDALONE und XML_PARAM_ENTITY_PARSING_ALWAYS. Gibt True zurü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 ExternalEntityRefHandler mit None für alle Argumente aufruft, um das Laden einer alternativen DTD zu ermöglichen. Wenn das Dokument keine Dokumenttyp-Deklaration enthält, wird der Handler ExternalEntityRefHandler trotzdem aufgerufen, aber die Handler StartDoctypeDeclHandler und EndDoctypeDeclHandler werden 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() oder ParseFile() aufgerufen werden; der Aufruf nach dem Aufruf einer dieser Methoden löst eine ExpatError aus, wobei das Attribut code auf errors.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 Methode SetReparseDeferralEnabled verwenden.

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 von SetReparseDeferralEnabled(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 von SetReparseDeferralEnabled() mit hasattr(), 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_text wahr 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 True gesetzt wird, puffert das xmlparser-Objekt Textinhalte, die von Expat zurückgegeben werden, um mehrere Aufrufe des Callbacks CharacterDataHandler() 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_text aktiviert ist, die Anzahl der im Puffer gespeicherten Bytes. Diese Bytes repräsentieren UTF-8-kodierten Text. Dieses Attribut hat keine sinnvolle Interpretation, wenn buffer_text falsch 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 Objekt errors definiert 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, oder None, falls sie weggelassen wurden. has_internal_subset ist True, 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, oder None, wenn kein Standardwert vorhanden ist (#IMPLIED Werte). Wenn das Attribut in der Dokumentinstanz obligatorisch angegeben werden muss, ist required True. 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_attributes wahr ist, ist dies eine Liste (siehe ordered_attributes fü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, EndCdataSectionHandler und ElementDeclHandler verwenden, 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 von CharacterDataHandler() erhalten können. Setzen Sie das Instanzattribut buffer_text auf True, 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 None für externe Entitäten. Der Parameter notationName ist None für geparste Entitäten und der Name der Notation für nicht geparste Entitäten. is_parameter_entity ist True, 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 StartElementHandler fü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 StartNamespaceDeclHandler aufgerufen wurde, um den Beginn des Gültigkeitsbereichs jeder Namespace-Deklaration anzuzeigen. Aufrufe an diesen Handler erfolgen nach dem entsprechenden EndElementHandler fü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 EndCdataSectionHandler sind 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 yes in einer XML-Deklaration gesetzt ist. Wenn dieser Handler 0 zurückgibt, löst der Parser einen XML_ERROR_NOT_STANDALONE Fehler 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 publicId None. 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 er 0 zurückgibt, löst der Parser einen XML_ERROR_EXTERNAL_ENTITY_HANDLING Fehler 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.messages ordnet diese Fehlercodes den Fehlermeldungen von Expat zu. Zum Beispiel

from 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 errors stellt auch Fehlermeldungskonstanten und ein Wörterbuch codes zur 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 1 nummeriert.

ExpatError.offset

Zeichenversatz innerhalb der Zeile, an dem der Fehler aufgetreten ist. Die erste Spalte wird mit 0 nummeriert.

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 ANY hat.

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 EMPTY deklariert 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 0 oder '&#0;').

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 NotStandaloneHandler gesetzt war und 0 zurü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.expat gemeldet 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 xml zu 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 xmlns zu deklarieren oder zu deklarieren.

xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI

Es wurde versucht, die URI eines der reservierten Namespace-Präfixe xml und xmlns an 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