\section{\module{xml.sax.xmlreader} ---
         Interface for XML parsers}

\declaremodule{standard}{xml.sax.xmlreader}
\modulesynopsis{Interface which SAX-compliant XML parsers must implement.}
\sectionauthor{Martin v. L\"owis}{loewis@informatik.hu-berlin.de}
\moduleauthor{Lars Marius Garshol}{larsga@garshol.priv.no}

\versionadded{2.0}


SAX parsers implement the \class{XMLReader} interface. They are
implemented in a Python module, which must provide a function
\function{create_parser()}. This function is invoked by 
\function{xml.sax.make_parser()} with no arguments to create a new 
parser object.

\begin{classdesc}{XMLReader}{}
  Base class which can be inherited by SAX parsers.
\end{classdesc}

\begin{classdesc}{IncrementalParser}{}
  In some cases, it is desirable not to parse an input source at once,
  but to feed chunks of the document as they get available. Note that
  the reader will normally not read the entire file, but read it in
  chunks as well; still \method{parse()} won't return until the entire
  document is processed. So these interfaces should be used if the
  blocking behaviour of \method{parse()} is not desirable.

  When the parser is instantiated it is ready to begin accepting data
  from the feed method immediately. After parsing has been finished
  with a call to close the reset method must be called to make the
  parser ready to accept new data, either from feed or using the parse
  method.

  Note that these methods must \emph{not} be called during parsing,
  that is, after parse has been called and before it returns.

  By default, the class also implements the parse method of the
  XMLReader interface using the feed, close and reset methods of the
  IncrementalParser interface as a convenience to SAX 2.0 driver
  writers.
\end{classdesc}

\begin{classdesc}{Locator}{}
  Interface for associating a SAX event with a document location. A
  locator object will return valid results only during calls to
  DocumentHandler methods; at any other time, the results are
  unpredictable. If information is not available, methods may return
  \code{None}.
\end{classdesc}

\begin{classdesc}{InputSource}{\optional{systemId}}
  Encapsulation of the information needed by the \class{XMLReader} to
  read entities.

  This class may include information about the public identifier,
  system identifier, byte stream (possibly with character encoding
  information) and/or the character stream of an entity.

  Applications will create objects of this class for use in the
  \method{XMLReader.parse()} method and for returning from
  EntityResolver.resolveEntity.

  An \class{InputSource} belongs to the application, the
  \class{XMLReader} is not allowed to modify \class{InputSource} objects
  passed to it from the application, although it may make copies and
  modify those.
\end{classdesc}

\begin{classdesc}{AttributesImpl}{attrs}
  This is a dictionary-like object which represents the element
  attributes in a \method{startElement()} call. In addition to the
  most useful dictionary operations, it supports a number of other
  methods as described below. Objects of this class should be
  instantiated by readers; \var{attrs} must be a dictionary-like
  object.
\end{classdesc}

\begin{classdesc}{AttributesNSImpl}{attrs, qnames}
  Namespace-aware variant of attributes, which will be passed to
  \method{startElementNS()}. It is derived from \class{AttributesImpl},
  but understands attribute names as two-tuples of \var{namespaceURI}
  and \var{localname}. In addition, it provides a number of methods
  expecting qualified names as they appear in the original document.
\end{classdesc}


\subsection{XMLReader Objects \label{xmlreader-objects}}

The \class{XMLReader} interface supports the following methods:

\begin{methoddesc}[XMLReader]{parse}{source}
  Process an input source, producing SAX events. The \var{source}
  object can be a system identifier (i.e. a string identifying the
  input source -- typically a file name or an URL), a file-like
  object, or an \class{InputSource} object. When \method{parse()}
  returns, the input is completely processed, and the parser object
  can be discarded or reset. As a limitation, the current implementation
  only accepts byte streams; processing of character streams is for
  further study.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getContentHandler}{}
  Return the current \class{ContentHandler}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setContentHandler}{handler}
  Set the current \class{ContentHandler}.  If no
  \class{ContentHandler} is set, content events will be discarded.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getDTDHandler}{}
  Return the current \class{DTDHandler}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setDTDHandler}{handler}
  Set the current \class{DTDHandler}.  If no \class{DTDHandler} is
  set, DTD events will be discarded.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getEntityResolver}{}
  Return the current \class{EntityResolver}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setEntityResolver}{handler}
  Set the current \class{EntityResolver}.  If no
  \class{EntityResolver} is set, attempts to resolve an external
  entity will result in opening the system identifier for the entity,
  and fail if it is not available. 
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getErrorHandler}{}
  Return the current \class{ErrorHandler}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setErrorHandler}{handler}
  Set the current error handler.  If no \class{ErrorHandler} is set,
  errors will be raised as exceptions, and warnings will be printed.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setLocale}{locale}
  Allow an application to set the locale for errors and warnings. 
   
  SAX parsers are not required to provide localization for errors and
  warnings; if they cannot support the requested locale, however, they
  must throw a SAX exception.  Applications may request a locale change
  in the middle of a parse.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getFeature}{featurename}
  Return the current setting for feature \var{featurename}.  If the
  feature is not recognized, \exception{SAXNotRecognizedException} is
  raised. The well-known featurenames are listed in the module
  \module{xml.sax.handler}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setFeature}{featurename, value}
  Set the \var{featurename} to \var{value}. If the feature is not
  recognized, \exception{SAXNotRecognizedException} is raised. If the
  feature or its setting is not supported by the parser,
  \var{SAXNotSupportedException} is raised.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{getProperty}{propertyname}
  Return the current setting for property \var{propertyname}. If the
  property is not recognized, a \exception{SAXNotRecognizedException}
  is raised. The well-known propertynames are listed in the module
  \module{xml.sax.handler}.
\end{methoddesc}

\begin{methoddesc}[XMLReader]{setProperty}{propertyname, value}
  Set the \var{propertyname} to \var{value}. If the property is not
  recognized, \exception{SAXNotRecognizedException} is raised. If the
  property or its setting is not supported by the parser,
  \var{SAXNotSupportedException} is raised.
\end{methoddesc}


\subsection{IncrementalParser Objects
            \label{incremental-parser-objects}}

Instances of \class{IncrementalParser} offer the following additional
methods:

\begin{methoddesc}[IncrementalParser]{feed}{data}
  Process a chunk of \var{data}.
\end{methoddesc}

\begin{methoddesc}[IncrementalParser]{close}{}
  Assume the end of the document. That will check well-formedness
  conditions that can be checked only at the end, invoke handlers, and
  may clean up resources allocated during parsing.
\end{methoddesc}

\begin{methoddesc}[IncrementalParser]{reset}{}
  This method is called after close has been called to reset the
  parser so that it is ready to parse new documents. The results of
  calling parse or feed after close without calling reset are
  undefined."""
\end{methoddesc}


\subsection{Locator Objects \label{locator-objects}}

Instances of \class{Locator} provide these methods:

\begin{methoddesc}[Locator]{getColumnNumber}{}
  Return the column number where the current event ends.
\end{methoddesc}

\begin{methoddesc}[Locator]{getLineNumber}{}
  Return the line number where the current event ends.
\end{methoddesc}

\begin{methoddesc}[Locator]{getPublicId}{}
  Return the public identifier for the current event.
\end{methoddesc}

\begin{methoddesc}[Locator]{getSystemId}{}
  Return the system identifier for the current event.
\end{methoddesc}


\subsection{InputSource Objects \label{input-source-objects}}

\begin{methoddesc}[InputSource]{setPublicId}{id}
  Sets the public identifier of this \class{InputSource}.
\end{methoddesc}

\begin{methoddesc}[InputSource]{getPublicId}{}
  Returns the public identifier of this \class{InputSource}.
\end{methoddesc}

\begin{methoddesc}[InputSource]{setSystemId}{id}
  Sets the system identifier of this \class{InputSource}.
\end{methoddesc}

\begin{methoddesc}[InputSource]{getSystemId}{}
  Returns the system identifier of this \class{InputSource}.
\end{methoddesc}

\begin{methoddesc}[InputSource]{setEncoding}{encoding}
  Sets the character encoding of this \class{InputSource}.

  The encoding must be a string acceptable for an XML encoding
  declaration (see section 4.3.3 of the XML recommendation).
 
  The encoding attribute of the \class{InputSource} is ignored if the
  \class{InputSource} also contains a character stream.
\end{methoddesc}

\begin{methoddesc}[InputSource]{getEncoding}{}
  Get the character encoding of this InputSource.
\end{methoddesc}

\begin{methoddesc}[InputSource]{setByteStream}{bytefile}
  Set the byte stream (a Python file-like object which does not
  perform byte-to-character conversion) for this input source.
  
  The SAX parser will ignore this if there is also a character stream
  specified, but it will use a byte stream in preference to opening a
  URI connection itself.
  
  If the application knows the character encoding of the byte stream,
  it should set it with the setEncoding method.
\end{methoddesc}

\begin{methoddesc}[InputSource]{getByteStream}{}
  Get the byte stream for this input source.
        
  The getEncoding method will return the character encoding for this
  byte stream, or None if unknown.
\end{methoddesc}

\begin{methoddesc}[InputSource]{setCharacterStream}{charfile}
  Set the character stream for this input source. (The stream must be
  a Python 1.6 Unicode-wrapped file-like that performs conversion to
  Unicode strings.)
  
  If there is a character stream specified, the SAX parser will ignore
  any byte stream and will not attempt to open a URI connection to the
  system identifier.
\end{methoddesc}

\begin{methoddesc}[InputSource]{getCharacterStream}{}
  Get the character stream for this input source.
\end{methoddesc}


\subsection{AttributesImpl Objects \label{attributes-impl-objects}}

\class{AttributesImpl} objects implement a portion of the mapping
protocol, and the methods \method{copy()}, \method{get()},
\method{has_key()}, \method{items()}, \method{keys()}, and
\method{values()}.  The following methods are also provided:

\begin{methoddesc}[AttributesImpl]{getLength}{}
  Return the number of attributes.
\end{methoddesc}

\begin{methoddesc}[AttributesImpl]{getNames}{}
  Return the names of the attributes.
\end{methoddesc}

\begin{methoddesc}[AttributesImpl]{getType}{name}
  Returns the type of the attribute \var{name}, which is normally
  \code{'CDATA'}.
\end{methoddesc}

\begin{methoddesc}[AttributesImpl]{getValue}{name}
  Return the value of attribute \var{name}.
\end{methoddesc}

% getValueByQName, getNameByQName, getQNameByName, getQNames available
% here already, but documented only for derived class.


\subsection{AttributesNSImpl Objects \label{attributes-ns-impl-objects}}

\begin{methoddesc}[AttributesNSImpl]{getValueByQName}{name}
  Return the value for a qualified name.
\end{methoddesc}

\begin{methoddesc}[AttributesNSImpl]{getNameByQName}{name}
  Return the \code{(\var{namespace}, \var{localname})} pair for a
  qualified \var{name}.
\end{methoddesc}

\begin{methoddesc}[AttributesNSImpl]{getQNameByName}{name}
  Return the qualified name for a \code{(\var{namespace},
  \var{localname})} pair.
\end{methoddesc}

\begin{methoddesc}[AttributesNSImpl]{getQNames}{}
  Return the qualified names of all attributes.
\end{methoddesc}
