| \section{\module{xml.dom.minidom} --- |
| Lightweight DOM implementation} |
| |
| \declaremodule{standard}{xml.dom.minidom} |
| \modulesynopsis{Lightweight Document Object Model (DOM) implementation.} |
| \moduleauthor{Paul Prescod}{paul@prescod.net} |
| \sectionauthor{Paul Prescod}{paul@prescod.net} |
| \sectionauthor{Martin v. L\"owis}{martin@v.loewis.de} |
| |
| \versionadded{2.0} |
| |
| \module{xml.dom.minidom} is a light-weight implementation of the |
| Document Object Model interface. It is intended to be |
| simpler than the full DOM and also significantly smaller. |
| |
| DOM applications typically start by parsing some XML into a DOM. With |
| \module{xml.dom.minidom}, this is done through the parse functions: |
| |
| \begin{verbatim} |
| from xml.dom.minidom import parse, parseString |
| |
| dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name |
| |
| datasource = open('c:\\temp\\mydata.xml') |
| dom2 = parse(datasource) # parse an open file |
| |
| dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>') |
| \end{verbatim} |
| |
| The \function{parse()} function can take either a filename or an open |
| file object. |
| |
| \begin{funcdesc}{parse}{filename_or_file{, parser}} |
| Return a \class{Document} from the given input. \var{filename_or_file} |
| may be either a file name, or a file-like object. \var{parser}, if |
| given, must be a SAX2 parser object. This function will change the |
| document handler of the parser and activate namespace support; other |
| parser configuration (like setting an entity resolver) must have been |
| done in advance. |
| \end{funcdesc} |
| |
| If you have XML in a string, you can use the |
| \function{parseString()} function instead: |
| |
| \begin{funcdesc}{parseString}{string\optional{, parser}} |
| Return a \class{Document} that represents the \var{string}. This |
| method creates a \class{StringIO} object for the string and passes |
| that on to \function{parse}. |
| \end{funcdesc} |
| |
| Both functions return a \class{Document} object representing the |
| content of the document. |
| |
| What the \function{parse()} and \function{parseString()} functions do |
| is connect an XML parser with a ``DOM builder'' that can accept parse |
| events from any SAX parser and convert them into a DOM tree. The name |
| of the functions are perhaps misleading, but are easy to grasp when |
| learning the interfaces. The parsing of the document will be |
| completed before these functions return; it's simply that these |
| functions do not provide a parser implementation themselves. |
| |
| You can also create a \class{Document} by calling a method on a ``DOM |
| Implementation'' object. You can get this object either by calling |
| the \function{getDOMImplementation()} function in the |
| \refmodule{xml.dom} package or the \module{xml.dom.minidom} module. |
| Using the implementation from the \module{xml.dom.minidom} module will |
| always return a \class{Document} instance from the minidom |
| implementation, while the version from \refmodule{xml.dom} may provide |
| an alternate implementation (this is likely if you have the |
| \ulink{PyXML package}{http://pyxml.sourceforge.net/} installed). Once |
| you have a \class{Document}, you can add child nodes to it to populate |
| the DOM: |
| |
| \begin{verbatim} |
| from xml.dom.minidom import getDOMImplementation |
| |
| impl = getDOMImplementation() |
| |
| newdoc = impl.createDocument(None, "some_tag", None) |
| top_element = newdoc.documentElement |
| text = newdoc.createTextNode('Some textual content.') |
| top_element.appendChild(text) |
| \end{verbatim} |
| |
| Once you have a DOM document object, you can access the parts of your |
| XML document through its properties and methods. These properties are |
| defined in the DOM specification. The main property of the document |
| object is the \member{documentElement} property. It gives you the |
| main element in the XML document: the one that holds all others. Here |
| is an example program: |
| |
| \begin{verbatim} |
| dom3 = parseString("<myxml>Some data</myxml>") |
| assert dom3.documentElement.tagName == "myxml" |
| \end{verbatim} |
| |
| When you are finished with a DOM, you should clean it up. This is |
| necessary because some versions of Python do not support garbage |
| collection of objects that refer to each other in a cycle. Until this |
| restriction is removed from all versions of Python, it is safest to |
| write your code as if cycles would not be cleaned up. |
| |
| The way to clean up a DOM is to call its \method{unlink()} method: |
| |
| \begin{verbatim} |
| dom1.unlink() |
| dom2.unlink() |
| dom3.unlink() |
| \end{verbatim} |
| |
| \method{unlink()} is a \module{xml.dom.minidom}-specific extension to |
| the DOM API. After calling \method{unlink()} on a node, the node and |
| its descendants are essentially useless. |
| |
| \begin{seealso} |
| \seetitle[http://www.w3.org/TR/REC-DOM-Level-1/]{Document Object |
| Model (DOM) Level 1 Specification} |
| {The W3C recommendation for the |
| DOM supported by \module{xml.dom.minidom}.} |
| \end{seealso} |
| |
| |
| \subsection{DOM Objects \label{dom-objects}} |
| |
| The definition of the DOM API for Python is given as part of the |
| \refmodule{xml.dom} module documentation. This section lists the |
| differences between the API and \refmodule{xml.dom.minidom}. |
| |
| |
| \begin{methoddesc}[Node]{unlink}{} |
| Break internal references within the DOM so that it will be garbage |
| collected on versions of Python without cyclic GC. Even when cyclic |
| GC is available, using this can make large amounts of memory available |
| sooner, so calling this on DOM objects as soon as they are no longer |
| needed is good practice. This only needs to be called on the |
| \class{Document} object, but may be called on child nodes to discard |
| children of that node. |
| \end{methoddesc} |
| |
| \begin{methoddesc}[Node]{writexml}{writer\optional{,indent=""\optional{,addindent=""\optional{,newl=""}}}} |
| Write XML to the writer object. The writer should have a |
| \method{write()} method which matches that of the file object |
| interface. The \var{indent} parameter is the indentation of the current |
| node. The \var{addindent} parameter is the incremental indentation to use |
| for subnodes of the current one. The \var{newl} parameter specifies the |
| string to use to terminate newlines. |
| |
| \versionchanged[The optional keyword parameters |
| \var{indent}, \var{addindent}, and \var{newl} were added to support pretty |
| output]{2.1} |
| |
| \versionchanged[For the \class{Document} node, an additional keyword |
| argument \var{encoding} can be used to specify the encoding field of the XML |
| header]{2.3} |
| \end{methoddesc} |
| |
| \begin{methoddesc}[Node]{toxml}{\optional{encoding}} |
| Return the XML that the DOM represents as a string. |
| |
| With no argument, the XML header does not specify an encoding, and the |
| result is Unicode string if the default encoding cannot represent all |
| characters in the document. Encoding this string in an encoding other |
| than UTF-8 is likely incorrect, since UTF-8 is the default encoding of |
| XML. |
| |
| With an explicit \var{encoding} argument, the result is a byte string |
| in the specified encoding. It is recommended that this argument is |
| always specified. To avoid \exception{UnicodeError} exceptions in case of |
| unrepresentable text data, the encoding argument should be specified |
| as "utf-8". |
| |
| \versionchanged[the \var{encoding} argument was introduced]{2.3} |
| \end{methoddesc} |
| |
| \begin{methoddesc}[Node]{toprettyxml}{\optional{indent\optional{, newl}}} |
| Return a pretty-printed version of the document. \var{indent} specifies |
| the indentation string and defaults to a tabulator; \var{newl} specifies |
| the string emitted at the end of each line and defaults to \code{\e n}. |
| |
| \versionadded{2.1} |
| \versionchanged[the encoding argument; see \method{toxml()}]{2.3} |
| \end{methoddesc} |
| |
| The following standard DOM methods have special considerations with |
| \refmodule{xml.dom.minidom}: |
| |
| \begin{methoddesc}[Node]{cloneNode}{deep} |
| Although this method was present in the version of |
| \refmodule{xml.dom.minidom} packaged with Python 2.0, it was seriously |
| broken. This has been corrected for subsequent releases. |
| \end{methoddesc} |
| |
| |
| \subsection{DOM Example \label{dom-example}} |
| |
| This example program is a fairly realistic example of a simple |
| program. In this particular case, we do not take much advantage |
| of the flexibility of the DOM. |
| |
| \verbatiminput{minidom-example.py} |
| |
| |
| \subsection{minidom and the DOM standard \label{minidom-and-dom}} |
| |
| The \refmodule{xml.dom.minidom} module is essentially a DOM |
| 1.0-compatible DOM with some DOM 2 features (primarily namespace |
| features). |
| |
| Usage of the DOM interface in Python is straight-forward. The |
| following mapping rules apply: |
| |
| \begin{itemize} |
| \item Interfaces are accessed through instance objects. Applications |
| should not instantiate the classes themselves; they should use |
| the creator functions available on the \class{Document} object. |
| Derived interfaces support all operations (and attributes) from |
| the base interfaces, plus any new operations. |
| |
| \item Operations are used as methods. Since the DOM uses only |
| \keyword{in} parameters, the arguments are passed in normal |
| order (from left to right). There are no optional |
| arguments. \keyword{void} operations return \code{None}. |
| |
| \item IDL attributes map to instance attributes. For compatibility |
| with the OMG IDL language mapping for Python, an attribute |
| \code{foo} can also be accessed through accessor methods |
| \method{_get_foo()} and \method{_set_foo()}. \keyword{readonly} |
| attributes must not be changed; this is not enforced at |
| runtime. |
| |
| \item The types \code{short int}, \code{unsigned int}, \code{unsigned |
| long long}, and \code{boolean} all map to Python integer |
| objects. |
| |
| \item The type \code{DOMString} maps to Python strings. |
| \refmodule{xml.dom.minidom} supports either byte or Unicode |
| strings, but will normally produce Unicode strings. Values |
| of type \code{DOMString} may also be \code{None} where allowed |
| to have the IDL \code{null} value by the DOM specification from |
| the W3C. |
| |
| \item \keyword{const} declarations map to variables in their |
| respective scope |
| (e.g. \code{xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE}); |
| they must not be changed. |
| |
| \item \code{DOMException} is currently not supported in |
| \refmodule{xml.dom.minidom}. Instead, |
| \refmodule{xml.dom.minidom} uses standard Python exceptions such |
| as \exception{TypeError} and \exception{AttributeError}. |
| |
| \item \class{NodeList} objects are implemented using Python's built-in |
| list type. Starting with Python 2.2, these objects provide the |
| interface defined in the DOM specification, but with earlier |
| versions of Python they do not support the official API. They |
| are, however, much more ``Pythonic'' than the interface defined |
| in the W3C recommendations. |
| \end{itemize} |
| |
| |
| The following interfaces have no implementation in |
| \refmodule{xml.dom.minidom}: |
| |
| \begin{itemize} |
| \item \class{DOMTimeStamp} |
| |
| \item \class{DocumentType} (added in Python 2.1) |
| |
| \item \class{DOMImplementation} (added in Python 2.1) |
| |
| \item \class{CharacterData} |
| |
| \item \class{CDATASection} |
| |
| \item \class{Notation} |
| |
| \item \class{Entity} |
| |
| \item \class{EntityReference} |
| |
| \item \class{DocumentFragment} |
| \end{itemize} |
| |
| Most of these reflect information in the XML document that is not of |
| general utility to most DOM users. |