xml.parsers.expat — Fast XML parsing using Expat¶
Note
If you need to parse untrusted or unauthenticated data, see XML security.
The xml.parsers.expat module is a Python interface to the Expat
non-validating XML parser. The module provides a single extension type,
xmlparser, that represents the current state of an XML parser. After
an xmlparser object has been created, various attributes of the object
can be set to handler functions. When an XML document is then fed to the
parser, the handler functions are called for the character data and markup in
the XML document.
This module uses the pyexpat module to provide access to the Expat
parser. Direct use of the pyexpat module is deprecated.
This module provides one exception and one type object:
- exception xml.parsers.expat.ExpatError¶
The exception raised when Expat reports an error. See section ExpatError Exceptions for more information on interpreting Expat errors.
- exception xml.parsers.expat.error¶
Alias for
ExpatError.
- xml.parsers.expat.XMLParserType¶
The type of the return values from the
ParserCreate()function.
The xml.parsers.expat module contains two functions:
- xml.parsers.expat.ErrorString(errno)¶
Returns an explanatory string for a given error number errno.
- xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None)¶
Creates and returns a new
xmlparserobject. encoding, if specified, must be a string naming the encoding used by the XML data. Expat doesn’t support as many encodings as Python does, and its repertoire of encodings can’t be extended; it supports UTF-8, UTF-16, ISO-8859-1 (Latin1), and ASCII. If encoding [1] is given it will override the implicit or explicit encoding of the document.Expat can optionally do XML namespace processing for you, enabled by providing a value for namespace_separator. The value must be a one-character string; a
ValueErrorwill be raised if the string has an illegal length (Noneis considered the same as omission). When namespace processing is enabled, element type names and attribute names that belong to a namespace will be expanded. The element name passed to the element handlersStartElementHandlerandEndElementHandlerwill be the concatenation of the namespace URI, the namespace separator character, and the local part of the name. If the namespace separator is a zero byte (chr(0)) then the namespace URI and the local part will be concatenated without any separator.For example, if namespace_separator is set to a space character (
' ') and the following document is parsed:<?xml version="1.0"?> <root xmlns = "http://default-namespace.org/" xmlns:py = "http://www.python.org/ns/"> <py:elem1 /> <elem2 xmlns="" /> </root>
StartElementHandlerwill receive the following strings for each element:http://default-namespace.org/ root http://www.python.org/ns/ elem1 elem2
Due to limitations in the
Expatlibrary used bypyexpat, thexmlparserinstance returned can only be used to parse a single XML document. CallParserCreatefor each document to provide unique parser instances.
See also
- The Expat XML Parser
Home page of the Expat project.
XMLParser Objects¶
xmlparser objects have the following methods:
- xmlparser.Parse(data[, isfinal])¶
Parses the contents of the string data, calling the appropriate handler functions to process the parsed data. isfinal must be true on the final call to this method; it allows the parsing of a single file in fragments, not the submission of multiple files. data can be the empty string at any time.
- xmlparser.ParseFile(file)¶
Parse XML data reading from the object file. file only needs to provide the
read(nbytes)method, returning the empty string when there’s no more data.
- xmlparser.SetBase(base)¶
Sets the base to be used for resolving relative URIs in system identifiers in declarations. Resolving relative identifiers is left to the application: this value will be passed through as the base argument to the
ExternalEntityRefHandler(),NotationDeclHandler(), andUnparsedEntityDeclHandler()functions.
- xmlparser.GetBase()¶
Returns a string containing the base set by a previous call to
SetBase(), orNoneifSetBase()hasn’t been called.
- xmlparser.GetInputContext()¶
Returns the input data that generated the current event as a string. The data is in the encoding of the entity which contains the text. When called while an event handler is not active, the return value is
None.
- xmlparser.ExternalEntityParserCreate(context[, encoding])¶
Create a “child” parser which can be used to parse an external parsed entity referred to by content parsed by the parent parser. The context parameter should be the string passed to the
ExternalEntityRefHandler()handler function, described below. The child parser is created with theordered_attributesandspecified_attributesset to the values of this parser.
- xmlparser.SetParamEntityParsing(flag)¶
Control parsing of parameter entities (including the external DTD subset). Possible flag values are
XML_PARAM_ENTITY_PARSING_NEVER,XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEandXML_PARAM_ENTITY_PARSING_ALWAYS. Return true if setting the flag was successful.
- xmlparser.UseForeignDTD([flag])¶
Calling this with a true value for flag (the default) will cause Expat to call the
ExternalEntityRefHandlerwithNonefor all arguments to allow an alternate DTD to be loaded. If the document does not contain a document type declaration, theExternalEntityRefHandlerwill still be called, but theStartDoctypeDeclHandlerandEndDoctypeDeclHandlerwill not be called.Passing a false value for flag will cancel a previous call that passed a true value, but otherwise has no effect.
This method can only be called before the
Parse()orParseFile()methods are called; calling it after either of those have been called causesExpatErrorto be raised with thecodeattribute set toerrors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING].
- xmlparser.SetReparseDeferralEnabled(enabled)¶
Warning
Calling
SetReparseDeferralEnabled(False)has security implications, as detailed below; please make sure to understand these consequences prior to using theSetReparseDeferralEnabledmethod.Expat 2.6.0 introduced a security mechanism called “reparse deferral” where instead of causing denial of service through quadratic runtime from reparsing large tokens, reparsing of unfinished tokens is now delayed by default until a sufficient amount of input is reached. Due to this delay, registered handlers may — depending of the sizing of input chunks pushed to Expat — no longer be called right after pushing new input to the parser. Where immediate feedback and taking over responsibility of protecting against denial of service from large tokens are both wanted, calling
SetReparseDeferralEnabled(False)disables reparse deferral for the current Expat parser instance, temporarily or altogether. CallingSetReparseDeferralEnabled(True)allows re-enabling reparse deferral.Note that
SetReparseDeferralEnabled()has been backported to some prior releases of CPython as a security fix. Check for availability ofSetReparseDeferralEnabled()usinghasattr()if used in code running across a variety of Python versions.Added in version 3.13.
- xmlparser.GetReparseDeferralEnabled()¶
Returns whether reparse deferral is currently enabled for the given Expat parser instance.
Added in version 3.13.
xmlparser objects have the following attributes:
- xmlparser.buffer_size¶
The size of the buffer used when
buffer_textis true. A new buffer size can be set by assigning a new integer value to this attribute. When the size is changed, the buffer will be flushed.
- xmlparser.buffer_text¶
Setting this to true causes the
xmlparserobject to buffer textual content returned by Expat to avoid multiple calls to theCharacterDataHandler()callback whenever possible. This can improve performance substantially since Expat normally breaks character data into chunks at every line ending. This attribute is false by default, and may be changed at any time. Note that when it is false, data that does not contain newlines may be chunked too.
- xmlparser.buffer_used¶
If
buffer_textis enabled, the number of bytes stored in the buffer. These bytes represent UTF-8 encoded text. This attribute has no meaningful interpretation whenbuffer_textis false.
- xmlparser.ordered_attributes¶
Setting this attribute to a non-zero integer causes the attributes to be reported as a list rather than a dictionary. The attributes are presented in the order found in the document text. For each attribute, two list entries are presented: the attribute name and the attribute value. (Older versions of this module also used this format.) By default, this attribute is false; it may be changed at any time.
- xmlparser.specified_attributes¶
If set to a non-zero integer, the parser will report only those attributes which were specified in the document instance and not those which were derived from attribute declarations. Applications which set this need to be especially careful to use what additional information is available from the declarations as needed to comply with the standards for the behavior of XML processors. By default, this attribute is false; it may be changed at any time.
The following attributes contain values relating to the most recent error
encountered by an xmlparser object, and will only have correct values
once a call to Parse() or ParseFile() has raised an
xml.parsers.expat.ExpatError exception.
- xmlparser.ErrorByteIndex¶
Byte index at which an error occurred.
- xmlparser.ErrorCode¶
Numeric code specifying the problem. This value can be passed to the
ErrorString()function, or compared to one of the constants defined in theerrorsobject.
- xmlparser.ErrorColumnNumber¶
Column number at which an error occurred.
- xmlparser.ErrorLineNumber¶
Line number at which an error occurred.
The following attributes contain values relating to the current parse location
in an xmlparser object. During a callback reporting a parse event they
indicate the location of the first of the sequence of characters that generated
the event. When called outside of a callback, the position indicated will be
just past the last parse event (regardless of whether there was an associated
callback).
- xmlparser.CurrentByteIndex¶
Current byte index in the parser input.
- xmlparser.CurrentColumnNumber¶
Current column number in the parser input.
- xmlparser.CurrentLineNumber¶
Current line number in the parser input.
Here is the list of handlers that can be set. To set a handler on an
xmlparser object o, use o.handlername = func. handlername must
be taken from the following list, and func must be a callable object accepting
the correct number of arguments. The arguments are all strings, unless
otherwise stated.
- xmlparser.XmlDeclHandler(version, encoding, standalone)¶
Called when the XML declaration is parsed. The XML declaration is the (optional) declaration of the applicable version of the XML recommendation, the encoding of the document text, and an optional “standalone” declaration. version and encoding will be strings, and standalone will be
1if the document is declared standalone,0if it is declared not to be standalone, or-1if the standalone clause was omitted. This is only available with Expat version 1.95.0 or newer.
- xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)¶
Called when Expat begins parsing the document type declaration (
<!DOCTYPE ...). The doctypeName is provided exactly as presented. The systemId and publicId parameters give the system and public identifiers if specified, orNoneif omitted. has_internal_subset will be true if the document contains and internal document declaration subset. This requires Expat version 1.2 or newer.
- xmlparser.EndDoctypeDeclHandler()¶
Called when Expat is done parsing the document type declaration. This requires Expat version 1.2 or newer.
- xmlparser.ElementDeclHandler(name, model)¶
Called once for each element type declaration. name is the name of the element type, and model is a representation of the content model.
- xmlparser.AttlistDeclHandler(elname, attname, type, default, required)¶
Called for each declared attribute for an element type. If an attribute list declaration declares three attributes, this handler is called three times, once for each attribute. elname is the name of the element to which the declaration applies and attname is the name of the attribute declared. The attribute type is a string passed as type; the possible values are
'CDATA','ID','IDREF', … default gives the default value for the attribute used when the attribute is not specified by the document instance, orNoneif there is no default value (#IMPLIEDvalues). If the attribute is required to be given in the document instance, required will be true. This requires Expat version 1.95.0 or newer.
- xmlparser.StartElementHandler(name, attributes)¶
Called for the start of every element. name is a string containing the element name, and attributes is the element attributes. If
ordered_attributesis true, this is a list (seeordered_attributesfor a full description). Otherwise it’s a dictionary mapping names to values.
- xmlparser.EndElementHandler(name)¶
Called for the end of every element.
- xmlparser.ProcessingInstructionHandler(target, data)¶
Called for every processing instruction.
- xmlparser.CharacterDataHandler(data)¶
Called for character data. This will be called for normal character data, CDATA marked content, and ignorable whitespace. Applications which must distinguish these cases can use the
StartCdataSectionHandler,EndCdataSectionHandler, andElementDeclHandlercallbacks to collect the required information. Note that the character data may be chunked even if it is short and so you may receive more than one call toCharacterDataHandler(). Set thebuffer_textinstance attribute toTrueto avoid that.
- xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)¶
Called for unparsed (NDATA) entity declarations. This is only present for version 1.2 of the Expat library; for more recent versions, use
EntityDeclHandlerinstead. (The underlying function in the Expat library has been declared obsolete.)
- xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)¶
Called for all entity declarations. For parameter and internal entities, value will be a string giving the declared contents of the entity; this will be
Nonefor external entities. The notationName parameter will beNonefor parsed entities, and the name of the notation for unparsed entities. is_parameter_entity will be true if the entity is a parameter entity or false for general entities (most applications only need to be concerned with general entities). This is only available starting with version 1.95.0 of the Expat library.
- xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)¶
Called for notation declarations. notationName, base, and systemId, and publicId are strings if given. If the public identifier is omitted, publicId will be
None.
- xmlparser.StartNamespaceDeclHandler(prefix, uri)¶
Called when an element contains a namespace declaration. Namespace declarations are processed before the
StartElementHandleris called for the element on which declarations are placed.
- xmlparser.EndNamespaceDeclHandler(prefix)¶
Called when the closing tag is reached for an element that contained a namespace declaration. This is called once for each namespace declaration on the element in the reverse of the order for which the
StartNamespaceDeclHandlerwas called to indicate the start of each namespace declaration’s scope. Calls to this handler are made after the corresponding