17db96d56Sopenharmony_ci:mod:`xml.dom` --- The Document Object Model API
27db96d56Sopenharmony_ci================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: xml.dom
57db96d56Sopenharmony_ci   :synopsis: Document Object Model API for Python.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. sectionauthor:: Paul Prescod <paul@prescod.net>
87db96d56Sopenharmony_ci.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/xml/dom/__init__.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci--------------
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciThe Document Object Model, or "DOM," is a cross-language API from the World Wide
157db96d56Sopenharmony_ciWeb Consortium (W3C) for accessing and modifying XML documents.  A DOM
167db96d56Sopenharmony_ciimplementation presents an XML document as a tree structure, or allows client
177db96d56Sopenharmony_cicode to build such a structure from scratch.  It then gives access to the
187db96d56Sopenharmony_cistructure through a set of objects which provided well-known interfaces.
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciThe DOM is extremely useful for random-access applications.  SAX only allows you
217db96d56Sopenharmony_cia view of one bit of the document at a time.  If you are looking at one SAX
227db96d56Sopenharmony_cielement, you have no access to another.  If you are looking at a text node, you
237db96d56Sopenharmony_cihave no access to a containing element. When you write a SAX application, you
247db96d56Sopenharmony_cineed to keep track of your program's position in the document somewhere in your
257db96d56Sopenharmony_ciown code.  SAX does not do it for you.  Also, if you need to look ahead in the
267db96d56Sopenharmony_ciXML document, you are just out of luck.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ciSome applications are simply impossible in an event driven model with no access
297db96d56Sopenharmony_cito a tree.  Of course you could build some sort of tree yourself in SAX events,
307db96d56Sopenharmony_cibut the DOM allows you to avoid writing that code.  The DOM is a standard tree
317db96d56Sopenharmony_cirepresentation for XML data.
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ciThe Document Object Model is being defined by the W3C in stages, or "levels" in
347db96d56Sopenharmony_citheir terminology.  The Python mapping of the API is substantially based on the
357db96d56Sopenharmony_ciDOM Level 2 recommendation.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci.. What if your needs are somewhere between SAX and the DOM?  Perhaps
387db96d56Sopenharmony_ci   you cannot afford to load the entire tree in memory but you find the
397db96d56Sopenharmony_ci   SAX model somewhat cumbersome and low-level.  There is also a module
407db96d56Sopenharmony_ci   called xml.dom.pulldom that allows you to build trees of only the
417db96d56Sopenharmony_ci   parts of a document that you need structured access to.  It also has
427db96d56Sopenharmony_ci   features that allow you to find your way around the DOM.
437db96d56Sopenharmony_ci   See http://www.prescod.net/python/pulldom
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ciDOM applications typically start by parsing some XML into a DOM.  How this is
467db96d56Sopenharmony_ciaccomplished is not covered at all by DOM Level 1, and Level 2 provides only
477db96d56Sopenharmony_cilimited improvements: There is a :class:`DOMImplementation` object class which
487db96d56Sopenharmony_ciprovides access to :class:`Document` creation methods, but no way to access an
497db96d56Sopenharmony_ciXML reader/parser/Document builder in an implementation-independent way. There
507db96d56Sopenharmony_ciis also no well-defined way to access these methods without an existing
517db96d56Sopenharmony_ci:class:`Document` object.  In Python, each DOM implementation will provide a
527db96d56Sopenharmony_cifunction :func:`getDOMImplementation`. DOM Level 3 adds a Load/Store
537db96d56Sopenharmony_cispecification, which defines an interface to the reader, but this is not yet
547db96d56Sopenharmony_ciavailable in the Python standard library.
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ciOnce you have a DOM document object, you can access the parts of your XML
577db96d56Sopenharmony_cidocument through its properties and methods.  These properties are defined in
587db96d56Sopenharmony_cithe DOM specification; this portion of the reference manual describes the
597db96d56Sopenharmony_ciinterpretation of the specification in Python.
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciThe specification provided by the W3C defines the DOM API for Java, ECMAScript,
627db96d56Sopenharmony_ciand OMG IDL.  The Python mapping defined here is based in large part on the IDL
637db96d56Sopenharmony_civersion of the specification, but strict compliance is not required (though
647db96d56Sopenharmony_ciimplementations are free to support the strict mapping from IDL).  See section
657db96d56Sopenharmony_ci:ref:`dom-conformance` for a detailed discussion of mapping requirements.
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci.. seealso::
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci   `Document Object Model (DOM) Level 2 Specification <https://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/>`_
717db96d56Sopenharmony_ci      The W3C recommendation upon which the Python DOM API is based.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   `Document Object Model (DOM) Level 1 Specification <https://www.w3.org/TR/REC-DOM-Level-1/>`_
747db96d56Sopenharmony_ci      The W3C recommendation for the DOM supported by :mod:`xml.dom.minidom`.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci   `Python Language Mapping Specification <https://www.omg.org/spec/PYTH/1.2/PDF>`_
777db96d56Sopenharmony_ci      This specifies the mapping from OMG IDL to Python.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ciModule Contents
817db96d56Sopenharmony_ci---------------
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ciThe :mod:`xml.dom` contains the following functions:
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci.. function:: registerDOMImplementation(name, factory)
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   Register the *factory* function with the name *name*.  The factory function
897db96d56Sopenharmony_ci   should return an object which implements the :class:`DOMImplementation`
907db96d56Sopenharmony_ci   interface.  The factory function can return the same object every time, or a new
917db96d56Sopenharmony_ci   one for each call, as appropriate for the specific implementation (e.g. if that
927db96d56Sopenharmony_ci   implementation supports some customization).
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci.. function:: getDOMImplementation(name=None, features=())
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci   Return a suitable DOM implementation. The *name* is either well-known, the
987db96d56Sopenharmony_ci   module name of a DOM implementation, or ``None``. If it is not ``None``, imports
997db96d56Sopenharmony_ci   the corresponding module and returns a :class:`DOMImplementation` object if the
1007db96d56Sopenharmony_ci   import succeeds.  If no name is given, and if the environment variable
1017db96d56Sopenharmony_ci   :envvar:`PYTHON_DOM` is set, this variable is used to find the implementation.
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci   If name is not given, this examines the available implementations to find one
1047db96d56Sopenharmony_ci   with the required feature set.  If no implementation can be found, raise an
1057db96d56Sopenharmony_ci   :exc:`ImportError`.  The features list must be a sequence of ``(feature,
1067db96d56Sopenharmony_ci   version)`` pairs which are passed to the :meth:`hasFeature` method on available
1077db96d56Sopenharmony_ci   :class:`DOMImplementation` objects.
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ciSome convenience constants are also provided:
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci.. data:: EMPTY_NAMESPACE
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci   The value used to indicate that no namespace is associated with a node in the
1157db96d56Sopenharmony_ci   DOM.  This is typically found as the :attr:`namespaceURI` of a node, or used as
1167db96d56Sopenharmony_ci   the *namespaceURI* parameter to a namespaces-specific method.
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci.. data:: XML_NAMESPACE
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci   The namespace URI associated with the reserved prefix ``xml``, as defined by
1227db96d56Sopenharmony_ci   `Namespaces in XML <https://www.w3.org/TR/REC-xml-names/>`_ (section 4).
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci.. data:: XMLNS_NAMESPACE
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci   The namespace URI for namespace declarations, as defined by `Document Object
1287db96d56Sopenharmony_ci   Model (DOM) Level 2 Core Specification
1297db96d56Sopenharmony_ci   <https://www.w3.org/TR/DOM-Level-2-Core/core.html>`_ (section 1.1.8).
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci.. data:: XHTML_NAMESPACE
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci   The URI of the XHTML namespace as defined by `XHTML 1.0: The Extensible
1357db96d56Sopenharmony_ci   HyperText Markup Language <https://www.w3.org/TR/xhtml1/>`_ (section 3.1.1).
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ciIn addition, :mod:`xml.dom` contains a base :class:`Node` class and the DOM
1397db96d56Sopenharmony_ciexception classes.  The :class:`Node` class provided by this module does not
1407db96d56Sopenharmony_ciimplement any of the methods or attributes defined by the DOM specification;
1417db96d56Sopenharmony_ciconcrete DOM implementations must provide those.  The :class:`Node` class
1427db96d56Sopenharmony_ciprovided as part of this module does provide the constants used for the
1437db96d56Sopenharmony_ci:attr:`nodeType` attribute on concrete :class:`Node` objects; they are located
1447db96d56Sopenharmony_ciwithin the class rather than at the module level to conform with the DOM
1457db96d56Sopenharmony_cispecifications.
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci.. Should the Node documentation go here?
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci.. _dom-objects:
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ciObjects in the DOM
1537db96d56Sopenharmony_ci------------------
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ciThe definitive documentation for the DOM is the DOM specification from the W3C.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ciNote that DOM attributes may also be manipulated as nodes instead of as simple
1587db96d56Sopenharmony_cistrings.  It is fairly rare that you must do this, however, so this usage is not
1597db96d56Sopenharmony_ciyet documented.
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1627db96d56Sopenharmony_ci| Interface                      | Section                           | Purpose                         |
1637db96d56Sopenharmony_ci+================================+===================================+=================================+
1647db96d56Sopenharmony_ci| :class:`DOMImplementation`     | :ref:`dom-implementation-objects` | Interface to the underlying     |
1657db96d56Sopenharmony_ci|                                |                                   | implementation.                 |
1667db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1677db96d56Sopenharmony_ci| :class:`Node`                  | :ref:`dom-node-objects`           | Base interface for most objects |
1687db96d56Sopenharmony_ci|                                |                                   | in a document.                  |
1697db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1707db96d56Sopenharmony_ci| :class:`NodeList`              | :ref:`dom-nodelist-objects`       | Interface for a sequence of     |
1717db96d56Sopenharmony_ci|                                |                                   | nodes.                          |
1727db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1737db96d56Sopenharmony_ci| :class:`DocumentType`          | :ref:`dom-documenttype-objects`   | Information about the           |
1747db96d56Sopenharmony_ci|                                |                                   | declarations needed to process  |
1757db96d56Sopenharmony_ci|                                |                                   | a document.                     |
1767db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1777db96d56Sopenharmony_ci| :class:`Document`              | :ref:`dom-document-objects`       | Object which represents an      |
1787db96d56Sopenharmony_ci|                                |                                   | entire document.                |
1797db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1807db96d56Sopenharmony_ci| :class:`Element`               | :ref:`dom-element-objects`        | Element nodes in the document   |
1817db96d56Sopenharmony_ci|                                |                                   | hierarchy.                      |
1827db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1837db96d56Sopenharmony_ci| :class:`Attr`                  | :ref:`dom-attr-objects`           | Attribute value nodes on        |
1847db96d56Sopenharmony_ci|                                |                                   | element nodes.                  |
1857db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1867db96d56Sopenharmony_ci| :class:`Comment`               | :ref:`dom-comment-objects`        | Representation of comments in   |
1877db96d56Sopenharmony_ci|                                |                                   | the source document.            |
1887db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1897db96d56Sopenharmony_ci| :class:`Text`                  | :ref:`dom-text-objects`           | Nodes containing textual        |
1907db96d56Sopenharmony_ci|                                |                                   | content from the document.      |
1917db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1927db96d56Sopenharmony_ci| :class:`ProcessingInstruction` | :ref:`dom-pi-objects`             | Processing instruction          |
1937db96d56Sopenharmony_ci|                                |                                   | representation.                 |
1947db96d56Sopenharmony_ci+--------------------------------+-----------------------------------+---------------------------------+
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ciAn additional section describes the exceptions defined for working with the DOM
1977db96d56Sopenharmony_ciin Python.
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci.. _dom-implementation-objects:
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ciDOMImplementation Objects
2037db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ciThe :class:`DOMImplementation` interface provides a way for applications to
2067db96d56Sopenharmony_cidetermine the availability of particular features in the DOM they are using.
2077db96d56Sopenharmony_ciDOM Level 2 added the ability to create new :class:`Document` and
2087db96d56Sopenharmony_ci:class:`DocumentType` objects using the :class:`DOMImplementation` as well.
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci.. method:: DOMImplementation.hasFeature(feature, version)
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci   Return ``True`` if the feature identified by the pair of strings *feature* and
2147db96d56Sopenharmony_ci   *version* is implemented.
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci.. method:: DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci   Return a new :class:`Document` object (the root of the DOM), with a child
2207db96d56Sopenharmony_ci   :class:`Element` object having the given *namespaceUri* and *qualifiedName*. The
2217db96d56Sopenharmony_ci   *doctype* must be a :class:`DocumentType` object created by
2227db96d56Sopenharmony_ci   :meth:`createDocumentType`, or ``None``. In the Python DOM API, the first two
2237db96d56Sopenharmony_ci   arguments can also be ``None`` in order to indicate that no :class:`Element`
2247db96d56Sopenharmony_ci   child is to be created.
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci.. method:: DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci   Return a new :class:`DocumentType` object that encapsulates the given
2307db96d56Sopenharmony_ci   *qualifiedName*, *publicId*, and *systemId* strings, representing the
2317db96d56Sopenharmony_ci   information contained in an XML document type declaration.
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci.. _dom-node-objects:
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ciNode Objects
2377db96d56Sopenharmony_ci^^^^^^^^^^^^
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ciAll of the components of an XML document are subclasses of :class:`Node`.
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci.. attribute:: Node.nodeType
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci   An integer representing the node type.  Symbolic constants for the types are on
2457db96d56Sopenharmony_ci   the :class:`Node` object: :const:`ELEMENT_NODE`, :const:`ATTRIBUTE_NODE`,
2467db96d56Sopenharmony_ci   :const:`TEXT_NODE`, :const:`CDATA_SECTION_NODE`, :const:`ENTITY_NODE`,
2477db96d56Sopenharmony_ci   :const:`PROCESSING_INSTRUCTION_NODE`, :const:`COMMENT_NODE`,
2487db96d56Sopenharmony_ci   :const:`DOCUMENT_NODE`, :const:`DOCUMENT_TYPE_NODE`, :const:`NOTATION_NODE`.
2497db96d56Sopenharmony_ci   This is a read-only attribute.
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci.. attribute:: Node.parentNode
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   The parent of the current node, or ``None`` for the document node. The value is
2557db96d56Sopenharmony_ci   always a :class:`Node` object or ``None``.  For :class:`Element` nodes, this
2567db96d56Sopenharmony_ci   will be the parent element, except for the root element, in which case it will
2577db96d56Sopenharmony_ci   be the :class:`Document` object. For :class:`Attr` nodes, this is always
2587db96d56Sopenharmony_ci   ``None``. This is a read-only attribute.
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci.. attribute:: Node.attributes
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci   A :class:`NamedNodeMap` of attribute objects.  Only elements have actual values
2647db96d56Sopenharmony_ci   for this; others provide ``None`` for this attribute. This is a read-only
2657db96d56Sopenharmony_ci   attribute.
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci.. attribute:: Node.previousSibling
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci   The node that immediately precedes this one with the same parent.  For
2717db96d56Sopenharmony_ci   instance the element with an end-tag that comes just before the *self*
2727db96d56Sopenharmony_ci   element's start-tag.  Of course, XML documents are made up of more than just
2737db96d56Sopenharmony_ci   elements so the previous sibling could be text, a comment, or something else.
2747db96d56Sopenharmony_ci   If this node is the first child of the parent, this attribute will be
2757db96d56Sopenharmony_ci   ``None``. This is a read-only attribute.
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci.. attribute:: Node.nextSibling
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci   The node that immediately follows this one with the same parent.  See also
2817db96d56Sopenharmony_ci   :attr:`previousSibling`.  If this is the last child of the parent, this
2827db96d56Sopenharmony_ci   attribute will be ``None``. This is a read-only attribute.
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci.. attribute:: Node.childNodes
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci   A list of nodes contained within this node. This is a read-only attribute.
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci.. attribute:: Node.firstChild
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci   The first child of the node, if there are any, or ``None``. This is a read-only
2937db96d56Sopenharmony_ci   attribute.
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci.. attribute:: Node.lastChild
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci   The last child of the node, if there are any, or ``None``. This is a read-only
2997db96d56Sopenharmony_ci   attribute.
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci.. attribute:: Node.localName
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci   The part of the :attr:`tagName` following the colon if there is one, else the
3057db96d56Sopenharmony_ci   entire :attr:`tagName`.  The value is a string.
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci.. attribute:: Node.prefix
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci   The part of the :attr:`tagName` preceding the colon if there is one, else the
3117db96d56Sopenharmony_ci   empty string.  The value is a string, or ``None``.
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci.. attribute:: Node.namespaceURI
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci   The namespace associated with the element name.  This will be a string or
3177db96d56Sopenharmony_ci   ``None``.  This is a read-only attribute.
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci.. attribute:: Node.nodeName
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci   This has a different meaning for each node type; see the DOM specification for
3237db96d56Sopenharmony_ci   details.  You can always get the information you would get here from another
3247db96d56Sopenharmony_ci   property such as the :attr:`tagName` property for elements or the :attr:`name`
3257db96d56Sopenharmony_ci   property for attributes. For all node types, the value of this attribute will be
3267db96d56Sopenharmony_ci   either a string or ``None``.  This is a read-only attribute.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci.. attribute:: Node.nodeValue
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci   This has a different meaning for each node type; see the DOM specification for
3327db96d56Sopenharmony_ci   details.  The situation is similar to that with :attr:`nodeName`.  The value is
3337db96d56Sopenharmony_ci   a string or ``None``.
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci.. method:: Node.hasAttributes()
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci   Return ``True`` if the node has any attributes.
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci.. method:: Node.hasChildNodes()
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci   Return ``True`` if the node has any child nodes.
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci.. method:: Node.isSameNode(other)
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci   Return ``True`` if *other* refers to the same node as this node. This is especially
3497db96d56Sopenharmony_ci   useful for DOM implementations which use any sort of proxy architecture (because
3507db96d56Sopenharmony_ci   more than one object can refer to the same node).
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   .. note::
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci      This is based on a proposed DOM Level 3 API which is still in the "working
3557db96d56Sopenharmony_ci      draft" stage, but this particular interface appears uncontroversial.  Changes
3567db96d56Sopenharmony_ci      from the W3C will not necessarily affect this method in the Python DOM interface
3577db96d56Sopenharmony_ci      (though any new W3C API for this would also be supported).
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci.. method:: Node.appendChild(newChild)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci   Add a new child node to this node at the end of the list of
3637db96d56Sopenharmony_ci   children, returning *newChild*. If the node was already in
3647db96d56Sopenharmony_ci   the tree, it is removed first.
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci.. method:: Node.insertBefore(newChild, refChild)
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci   Insert a new child node before an existing child.  It must be the case that
3707db96d56Sopenharmony_ci   *refChild* is a child of this node; if not, :exc:`ValueError` is raised.
3717db96d56Sopenharmony_ci   *newChild* is returned. If *refChild* is ``None``, it inserts *newChild* at the
3727db96d56Sopenharmony_ci   end of the children's list.
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci.. method:: Node.removeChild(oldChild)
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci   Remove a child node.  *oldChild* must be a child of this node; if not,
3787db96d56Sopenharmony_ci   :exc:`ValueError` is raised.  *oldChild* is returned on success.  If *oldChild*
3797db96d56Sopenharmony_ci   will not be used further, its :meth:`unlink` method should be called.
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci.. method:: Node.replaceChild(newChild, oldChild)
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci   Replace an existing node with a new node. It must be the case that  *oldChild*
3857db96d56Sopenharmony_ci   is a child of this node; if not, :exc:`ValueError` is raised.
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci.. method:: Node.normalize()
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci   Join adjacent text nodes so that all stretches of text are stored as single
3917db96d56Sopenharmony_ci   :class:`Text` instances.  This simplifies processing text from a DOM tree for
3927db96d56Sopenharmony_ci   many applications.
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci.. method:: Node.cloneNode(deep)
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci   Clone this node.  Setting *deep* means to clone all child nodes as well.  This
3987db96d56Sopenharmony_ci   returns the clone.
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci.. _dom-nodelist-objects:
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ciNodeList Objects
4047db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ciA :class:`NodeList` represents a sequence of nodes.  These objects are used in
4077db96d56Sopenharmony_citwo ways in the DOM Core recommendation:  an :class:`Element` object provides
4087db96d56Sopenharmony_cione as its list of child nodes, and the :meth:`getElementsByTagName` and
4097db96d56Sopenharmony_ci:meth:`getElementsByTagNameNS` methods of :class:`Node` return objects with this
4107db96d56Sopenharmony_ciinterface to represent query results.
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ciThe DOM Level 2 recommendation defines one method and one attribute for these
4137db96d56Sopenharmony_ciobjects:
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci.. method:: NodeList.item(i)
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   Return the *i*'th item from the sequence, if there is one, or ``None``.  The
4197db96d56Sopenharmony_ci   index *i* is not allowed to be less than zero or greater than or equal to the
4207db96d56Sopenharmony_ci   length of the sequence.
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci.. attribute:: NodeList.length
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci   The number of nodes in the sequence.
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ciIn addition, the Python DOM interface requires that some additional support is
4287db96d56Sopenharmony_ciprovided to allow :class:`NodeList` objects to be used as Python sequences.  All
4297db96d56Sopenharmony_ci:class:`NodeList` implementations must include support for
4307db96d56Sopenharmony_ci:meth:`~object.__len__` and
4317db96d56Sopenharmony_ci:meth:`~object.__getitem__`; this allows iteration over the :class:`NodeList` in
4327db96d56Sopenharmony_ci:keyword:`for` statements and proper support for the :func:`len` built-in
4337db96d56Sopenharmony_cifunction.
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ciIf a DOM implementation supports modification of the document, the
4367db96d56Sopenharmony_ci:class:`NodeList` implementation must also support the
4377db96d56Sopenharmony_ci:meth:`~object.__setitem__` and :meth:`~object.__delitem__` methods.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci.. _dom-documenttype-objects:
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ciDocumentType Objects
4437db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ciInformation about the notations and entities declared by a document (including
4467db96d56Sopenharmony_cithe external subset if the parser uses it and can provide the information) is
4477db96d56Sopenharmony_ciavailable from a :class:`DocumentType` object.  The :class:`DocumentType` for a
4487db96d56Sopenharmony_cidocument is available from the :class:`Document` object's :attr:`doctype`
4497db96d56Sopenharmony_ciattribute; if there is no ``DOCTYPE`` declaration for the document, the
4507db96d56Sopenharmony_cidocument's :attr:`doctype` attribute will be set to ``None`` instead of an
4517db96d56Sopenharmony_ciinstance of this interface.
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci:class:`DocumentType` is a specialization of :class:`Node`, and adds the
4547db96d56Sopenharmony_cifollowing attributes:
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci.. attribute:: DocumentType.publicId
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci   The public identifier for the external subset of the document type definition.
4607db96d56Sopenharmony_ci   This will be a string or ``None``.
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci
4637db96d56Sopenharmony_ci.. attribute:: DocumentType.systemId
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci   The system identifier for the external subset of the document type definition.
4667db96d56Sopenharmony_ci   This will be a URI as a string, or ``None``.
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci.. attribute:: DocumentType.internalSubset
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci   A string giving the complete internal subset from the document. This does not
4727db96d56Sopenharmony_ci   include the brackets which enclose the subset.  If the document has no internal
4737db96d56Sopenharmony_ci   subset, this should be ``None``.
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci.. attribute:: DocumentType.name
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci   The name of the root element as given in the ``DOCTYPE`` declaration, if
4797db96d56Sopenharmony_ci   present.
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci.. attribute:: DocumentType.entities
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci   This is a :class:`NamedNodeMap` giving the definitions of external entities.
4857db96d56Sopenharmony_ci   For entity names defined more than once, only the first definition is provided
4867db96d56Sopenharmony_ci   (others are ignored as required by the XML recommendation).  This may be
4877db96d56Sopenharmony_ci   ``None`` if the information is not provided by the parser, or if no entities are
4887db96d56Sopenharmony_ci   defined.
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci.. attribute:: DocumentType.notations
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci   This is a :class:`NamedNodeMap` giving the definitions of notations. For
4947db96d56Sopenharmony_ci   notation names defined more than once, only the first definition is provided
4957db96d56Sopenharmony_ci   (others are ignored as required by the XML recommendation).  This may be
4967db96d56Sopenharmony_ci   ``None`` if the information is not provided by the parser, or if no notations
4977db96d56Sopenharmony_ci   are defined.
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci.. _dom-document-objects:
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ciDocument Objects
5037db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ciA :class:`Document` represents an entire XML document, including its constituent
5067db96d56Sopenharmony_cielements, attributes, processing instructions, comments etc.  Remember that it
5077db96d56Sopenharmony_ciinherits properties from :class:`Node`.
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci.. attribute:: Document.documentElement
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci   The one and only root element of the document.
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci.. method:: Document.createElement(tagName)
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci   Create and return a new element node.  The element is not inserted into the
5187db96d56Sopenharmony_ci   document when it is created.  You need to explicitly insert it with one of the
5197db96d56Sopenharmony_ci   other methods such as :meth:`insertBefore` or :meth:`appendChild`.
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci.. method:: Document.createElementNS(namespaceURI, tagName)
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci   Create and return a new element with a namespace.  The *tagName* may have a
5257db96d56Sopenharmony_ci   prefix.  The element is not inserted into the document when it is created.  You
5267db96d56Sopenharmony_ci   need to explicitly insert it with one of the other methods such as
5277db96d56Sopenharmony_ci   :meth:`insertBefore` or :meth:`appendChild`.
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci.. method:: Document.createTextNode(data)
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci   Create and return a text node containing the data passed as a parameter.  As
5337db96d56Sopenharmony_ci   with the other creation methods, this one does not insert the node into the
5347db96d56Sopenharmony_ci   tree.
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci.. method:: Document.createComment(data)
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci   Create and return a comment node containing the data passed as a parameter.  As
5407db96d56Sopenharmony_ci   with the other creation methods, this one does not insert the node into the
5417db96d56Sopenharmony_ci   tree.
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci.. method:: Document.createProcessingInstruction(target, data)
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci   Create and return a processing instruction node containing the *target* and
5477db96d56Sopenharmony_ci   *data* passed as parameters.  As with the other creation methods, this one does
5487db96d56Sopenharmony_ci   not insert the node into the tree.
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci.. method:: Document.createAttribute(name)
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci   Create and return an attribute node.  This method does not associate the
5547db96d56Sopenharmony_ci   attribute node with any particular element.  You must use
5557db96d56Sopenharmony_ci   :meth:`setAttributeNode` on the appropriate :class:`Element` object to use the
5567db96d56Sopenharmony_ci   newly created attribute instance.
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci.. method:: Document.createAttributeNS(namespaceURI, qualifiedName)
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci   Create and return an attribute node with a namespace.  The *tagName* may have a
5627db96d56Sopenharmony_ci   prefix.  This method does not associate the attribute node with any particular
5637db96d56Sopenharmony_ci   element.  You must use :meth:`setAttributeNode` on the appropriate
5647db96d56Sopenharmony_ci   :class:`Element` object to use the newly created attribute instance.
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci.. method:: Document.getElementsByTagName(tagName)
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci   Search for all descendants (direct children, children's children, etc.) with a
5707db96d56Sopenharmony_ci   particular element type name.
5717db96d56Sopenharmony_ci
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci.. method:: Document.getElementsByTagNameNS(namespaceURI, localName)
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci   Search for all descendants (direct children, children's children, etc.) with a
5767db96d56Sopenharmony_ci   particular namespace URI and localname.  The localname is the part of the
5777db96d56Sopenharmony_ci   namespace after the prefix.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci.. _dom-element-objects:
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ciElement Objects
5837db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci:class:`Element` is a subclass of :class:`Node`, so inherits all the attributes
5867db96d56Sopenharmony_ciof that class.
5877db96d56Sopenharmony_ci
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci.. attribute:: Element.tagName
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci   The element type name.  In a namespace-using document it may have colons in it.
5927db96d56Sopenharmony_ci   The value is a string.
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci.. method:: Element.getElementsByTagName(tagName)
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci   Same as equivalent method in the :class:`Document` class.
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci.. method:: Element.getElementsByTagNameNS(namespaceURI, localName)
6017db96d56Sopenharmony_ci
6027db96d56Sopenharmony_ci   Same as equivalent method in the :class:`Document` class.
6037db96d56Sopenharmony_ci
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci.. method:: Element.hasAttribute(name)
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci   Return ``True`` if the element has an attribute named by *name*.
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci.. method:: Element.hasAttributeNS(namespaceURI, localName)
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci   Return ``True`` if the element has an attribute named by *namespaceURI* and
6137db96d56Sopenharmony_ci   *localName*.
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci.. method:: Element.getAttribute(name)
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci   Return the value of the attribute named by *name* as a string. If no such
6197db96d56Sopenharmony_ci   attribute exists, an empty string is returned, as if the attribute had no value.
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci.. method:: Element.getAttributeNode(attrname)
6237db96d56Sopenharmony_ci
6247db96d56Sopenharmony_ci   Return the :class:`Attr` node for the attribute named by *attrname*.
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci.. method:: Element.getAttributeNS(namespaceURI, localName)
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci   Return the value of the attribute named by *namespaceURI* and *localName* as a
6307db96d56Sopenharmony_ci   string. If no such attribute exists, an empty string is returned, as if the
6317db96d56Sopenharmony_ci   attribute had no value.
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci
6347db96d56Sopenharmony_ci.. method:: Element.getAttributeNodeNS(namespaceURI, localName)
6357db96d56Sopenharmony_ci
6367db96d56Sopenharmony_ci   Return an attribute value as a node, given a *namespaceURI* and *localName*.
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci.. method:: Element.removeAttribute(name)
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci   Remove an attribute by name.  If there is no matching attribute, a
6427db96d56Sopenharmony_ci   :exc:`NotFoundErr` is raised.
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci.. method:: Element.removeAttributeNode(oldAttr)
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci   Remove and return *oldAttr* from the attribute list, if present. If *oldAttr* is
6487db96d56Sopenharmony_ci   not present, :exc:`NotFoundErr` is raised.
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci.. method:: Element.removeAttributeNS(namespaceURI, localName)
6527db96d56Sopenharmony_ci
6537db96d56Sopenharmony_ci   Remove an attribute by name.  Note that it uses a localName, not a qname.  No
6547db96d56Sopenharmony_ci   exception is raised if there is no matching attribute.
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci.. method:: Element.setAttribute(name, value)
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci   Set an attribute value from a string.
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci.. method:: Element.setAttributeNode(newAttr)
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci   Add a new attribute node to the element, replacing an existing attribute if
6657db96d56Sopenharmony_ci   necessary if the :attr:`name` attribute matches.  If a replacement occurs, the
6667db96d56Sopenharmony_ci   old attribute node will be returned.  If *newAttr* is already in use,
6677db96d56Sopenharmony_ci   :exc:`InuseAttributeErr` will be raised.
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci.. method:: Element.setAttributeNodeNS(newAttr)
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci   Add a new attribute node to the element, replacing an existing attribute if
6737db96d56Sopenharmony_ci   necessary if the :attr:`namespaceURI` and :attr:`localName` attributes match.
6747db96d56Sopenharmony_ci   If a replacement occurs, the old attribute node will be returned.  If *newAttr*
6757db96d56Sopenharmony_ci   is already in use, :exc:`InuseAttributeErr` will be raised.
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci.. method:: Element.setAttributeNS(namespaceURI, qname, value)
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci   Set an attribute value from a string, given a *namespaceURI* and a *qname*.
6817db96d56Sopenharmony_ci   Note that a qname is the whole attribute name.  This is different than above.
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci.. _dom-attr-objects:
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ciAttr Objects
6877db96d56Sopenharmony_ci^^^^^^^^^^^^
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci:class:`Attr` inherits from :class:`Node`, so inherits all its attributes.
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci.. attribute:: Attr.name
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci   The attribute name.
6957db96d56Sopenharmony_ci   In a namespace-using document it may include a colon.
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci.. attribute:: Attr.localName
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci   The part of the name following the colon if there is one, else the
7017db96d56Sopenharmony_ci   entire name.
7027db96d56Sopenharmony_ci   This is a read-only attribute.
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci.. attribute:: Attr.prefix
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci   The part of the name preceding the colon if there is one, else the
7087db96d56Sopenharmony_ci   empty string.
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ci
7117db96d56Sopenharmony_ci.. attribute:: Attr.value
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci   The text value of the attribute.  This is a synonym for the
7147db96d56Sopenharmony_ci   :attr:`nodeValue` attribute.
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci.. _dom-attributelist-objects:
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ciNamedNodeMap Objects
7207db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci:class:`NamedNodeMap` does *not* inherit from :class:`Node`.
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci.. attribute:: NamedNodeMap.length
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci   The length of the attribute list.
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci
7307db96d56Sopenharmony_ci.. method:: NamedNodeMap.item(index)
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci   Return an attribute with a particular index.  The order you get the attributes
7337db96d56Sopenharmony_ci   in is arbitrary but will be consistent for the life of a DOM.  Each item is an
7347db96d56Sopenharmony_ci   attribute node.  Get its value with the :attr:`value` attribute.
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ciThere are also experimental methods that give this class more mapping behavior.
7377db96d56Sopenharmony_ciYou can use them or you can use the standardized :meth:`getAttribute\*` family
7387db96d56Sopenharmony_ciof methods on the :class:`Element` objects.
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci.. _dom-comment-objects:
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ciComment Objects
7447db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci:class:`Comment` represents a comment in the XML document.  It is a subclass of
7477db96d56Sopenharmony_ci:class:`Node`, but cannot have child nodes.
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci.. attribute:: Comment.data
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci   The content of the comment as a string.  The attribute contains all characters
7537db96d56Sopenharmony_ci   between the leading ``<!-``\ ``-`` and trailing ``-``\ ``->``, but does not
7547db96d56Sopenharmony_ci   include them.
7557db96d56Sopenharmony_ci
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ci.. _dom-text-objects:
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ciText and CDATASection Objects
7607db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ciThe :class:`Text` interface represents text in the XML document.  If the parser
7637db96d56Sopenharmony_ciand DOM implementation support the DOM's XML extension, portions of the text
7647db96d56Sopenharmony_cienclosed in CDATA marked sections are stored in :class:`CDATASection` objects.
7657db96d56Sopenharmony_ciThese two interfaces are identical, but provide different values for the
7667db96d56Sopenharmony_ci:attr:`nodeType` attribute.
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ciThese interfaces extend the :class:`Node` interface.  They cannot have child
7697db96d56Sopenharmony_cinodes.
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci.. attribute:: Text.data
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci   The content of the text node as a string.
7757db96d56Sopenharmony_ci
7767db96d56Sopenharmony_ci.. note::
7777db96d56Sopenharmony_ci
7787db96d56Sopenharmony_ci   The use of a :class:`CDATASection` node does not indicate that the node
7797db96d56Sopenharmony_ci   represents a complete CDATA marked section, only that the content of the node
7807db96d56Sopenharmony_ci   was part of a CDATA section.  A single CDATA section may be represented by more
7817db96d56Sopenharmony_ci   than one node in the document tree.  There is no way to determine whether two
7827db96d56Sopenharmony_ci   adjacent :class:`CDATASection` nodes represent different CDATA marked sections.
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci.. _dom-pi-objects:
7867db96d56Sopenharmony_ci
7877db96d56Sopenharmony_ciProcessingInstruction Objects
7887db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ciRepresents a processing instruction in the XML document; this inherits from the
7917db96d56Sopenharmony_ci:class:`Node` interface and cannot have child nodes.
7927db96d56Sopenharmony_ci
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci.. attribute:: ProcessingInstruction.target
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci   The content of the processing instruction up to the first whitespace character.
7977db96d56Sopenharmony_ci   This is a read-only attribute.
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ci
8007db96d56Sopenharmony_ci.. attribute:: ProcessingInstruction.data
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci   The content of the processing instruction following the first whitespace
8037db96d56Sopenharmony_ci   character.
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci.. _dom-exceptions:
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ciExceptions
8097db96d56Sopenharmony_ci^^^^^^^^^^
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ciThe DOM Level 2 recommendation defines a single exception, :exc:`DOMException`,
8127db96d56Sopenharmony_ciand a number of constants that allow applications to determine what sort of
8137db96d56Sopenharmony_cierror occurred. :exc:`DOMException` instances carry a :attr:`code` attribute
8147db96d56Sopenharmony_cithat provides the appropriate value for the specific exception.
8157db96d56Sopenharmony_ci
8167db96d56Sopenharmony_ciThe Python DOM interface provides the constants, but also expands the set of
8177db96d56Sopenharmony_ciexceptions so that a specific exception exists for each of the exception codes
8187db96d56Sopenharmony_cidefined by the DOM.  The implementations must raise the appropriate specific
8197db96d56Sopenharmony_ciexception, each of which carries the appropriate value for the :attr:`code`
8207db96d56Sopenharmony_ciattribute.
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci.. exception:: DOMException
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci   Base exception class used for all specific DOM exceptions.  This exception class
8267db96d56Sopenharmony_ci   cannot be directly instantiated.
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci.. exception:: DomstringSizeErr
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci   Raised when a specified range of text does not fit into a string. This is not
8327db96d56Sopenharmony_ci   known to be used in the Python DOM implementations, but may be received from DOM
8337db96d56Sopenharmony_ci   implementations not written in Python.
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci.. exception:: HierarchyRequestErr
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci   Raised when an attempt is made to insert a node where the node type is not
8397db96d56Sopenharmony_ci   allowed.
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ci.. exception:: IndexSizeErr
8437db96d56Sopenharmony_ci
8447db96d56Sopenharmony_ci   Raised when an index or size parameter to a method is negative or exceeds the
8457db96d56Sopenharmony_ci   allowed values.
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ci
8487db96d56Sopenharmony_ci.. exception:: InuseAttributeErr
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci   Raised when an attempt is made to insert an :class:`Attr` node that is already
8517db96d56Sopenharmony_ci   present elsewhere in the document.
8527db96d56Sopenharmony_ci
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_ci.. exception:: InvalidAccessErr
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci   Raised if a parameter or an operation is not supported on the underlying object.
8577db96d56Sopenharmony_ci
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci.. exception:: InvalidCharacterErr
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci   This exception is raised when a string parameter contains a character that is
8627db96d56Sopenharmony_ci   not permitted in the context it's being used in by the XML 1.0 recommendation.
8637db96d56Sopenharmony_ci   For example, attempting to create an :class:`Element` node with a space in the
8647db96d56Sopenharmony_ci   element type name will cause this error to be raised.
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci.. exception:: InvalidModificationErr
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci   Raised when an attempt is made to modify the type of a node.
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci.. exception:: InvalidStateErr
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ci   Raised when an attempt is made to use an object that is not defined or is no
8757db96d56Sopenharmony_ci   longer usable.
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci.. exception:: NamespaceErr
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci   If an attempt is made to change any object in a way that is not permitted with
8817db96d56Sopenharmony_ci   regard to the `Namespaces in XML <https://www.w3.org/TR/REC-xml-names/>`_
8827db96d56Sopenharmony_ci   recommendation, this exception is raised.
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci.. exception:: NotFoundErr
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci   Exception when a node does not exist in the referenced context.  For example,
8887db96d56Sopenharmony_ci   :meth:`NamedNodeMap.removeNamedItem` will raise this if the node passed in does
8897db96d56Sopenharmony_ci   not exist in the map.
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci.. exception:: NotSupportedErr
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci   Raised when the implementation does not support the requested type of object or
8957db96d56Sopenharmony_ci   operation.
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci.. exception:: NoDataAllowedErr
8997db96d56Sopenharmony_ci
9007db96d56Sopenharmony_ci   This is raised if data is specified for a node which does not support data.
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci   .. XXX  a better explanation is needed!
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci.. exception:: NoModificationAllowedErr
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci   Raised on attempts to modify an object where modifications are not allowed (such
9087db96d56Sopenharmony_ci   as for read-only nodes).
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci.. exception:: SyntaxErr
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci   Raised when an invalid or illegal string is specified.
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci   .. XXX  how is this different from InvalidCharacterErr?
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci.. exception:: WrongDocumentErr
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci   Raised when a node is inserted in a different document than it currently belongs
9217db96d56Sopenharmony_ci   to, and the implementation does not support migrating the node from one document
9227db96d56Sopenharmony_ci   to the other.
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_ciThe exception codes defined in the DOM recommendation map to the exceptions
9257db96d56Sopenharmony_cidescribed above according to this table:
9267db96d56Sopenharmony_ci
9277db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9287db96d56Sopenharmony_ci| Constant                             | Exception                       |
9297db96d56Sopenharmony_ci+======================================+=================================+
9307db96d56Sopenharmony_ci| :const:`DOMSTRING_SIZE_ERR`          | :exc:`DomstringSizeErr`         |
9317db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9327db96d56Sopenharmony_ci| :const:`HIERARCHY_REQUEST_ERR`       | :exc:`HierarchyRequestErr`      |
9337db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9347db96d56Sopenharmony_ci| :const:`INDEX_SIZE_ERR`              | :exc:`IndexSizeErr`             |
9357db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9367db96d56Sopenharmony_ci| :const:`INUSE_ATTRIBUTE_ERR`         | :exc:`InuseAttributeErr`        |
9377db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9387db96d56Sopenharmony_ci| :const:`INVALID_ACCESS_ERR`          | :exc:`InvalidAccessErr`         |
9397db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9407db96d56Sopenharmony_ci| :const:`INVALID_CHARACTER_ERR`       | :exc:`InvalidCharacterErr`      |
9417db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9427db96d56Sopenharmony_ci| :const:`INVALID_MODIFICATION_ERR`    | :exc:`InvalidModificationErr`   |
9437db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9447db96d56Sopenharmony_ci| :const:`INVALID_STATE_ERR`           | :exc:`InvalidStateErr`          |
9457db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9467db96d56Sopenharmony_ci| :const:`NAMESPACE_ERR`               | :exc:`NamespaceErr`             |
9477db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9487db96d56Sopenharmony_ci| :const:`NOT_FOUND_ERR`               | :exc:`NotFoundErr`              |
9497db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9507db96d56Sopenharmony_ci| :const:`NOT_SUPPORTED_ERR`           | :exc:`NotSupportedErr`          |
9517db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9527db96d56Sopenharmony_ci| :const:`NO_DATA_ALLOWED_ERR`         | :exc:`NoDataAllowedErr`         |
9537db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9547db96d56Sopenharmony_ci| :const:`NO_MODIFICATION_ALLOWED_ERR` | :exc:`NoModificationAllowedErr` |
9557db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9567db96d56Sopenharmony_ci| :const:`SYNTAX_ERR`                  | :exc:`SyntaxErr`                |
9577db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9587db96d56Sopenharmony_ci| :const:`WRONG_DOCUMENT_ERR`          | :exc:`WrongDocumentErr`         |
9597db96d56Sopenharmony_ci+--------------------------------------+---------------------------------+
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci.. _dom-conformance:
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ciConformance
9657db96d56Sopenharmony_ci-----------
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ciThis section describes the conformance requirements and relationships between
9687db96d56Sopenharmony_cithe Python DOM API, the W3C DOM recommendations, and the OMG IDL mapping for
9697db96d56Sopenharmony_ciPython.
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci.. _dom-type-mapping:
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ciType Mapping
9757db96d56Sopenharmony_ci^^^^^^^^^^^^
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ciThe IDL types used in the DOM specification are mapped to Python types
9787db96d56Sopenharmony_ciaccording to the following table.
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9817db96d56Sopenharmony_ci| IDL Type         | Python Type                               |
9827db96d56Sopenharmony_ci+==================+===========================================+
9837db96d56Sopenharmony_ci| ``boolean``      | ``bool`` or ``int``                       |
9847db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9857db96d56Sopenharmony_ci| ``int``          | ``int``                                   |
9867db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9877db96d56Sopenharmony_ci| ``long int``     | ``int``                                   |
9887db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9897db96d56Sopenharmony_ci| ``unsigned int`` | ``int``                                   |
9907db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9917db96d56Sopenharmony_ci| ``DOMString``    | ``str`` or ``bytes``                      |
9927db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9937db96d56Sopenharmony_ci| ``null``         | ``None``                                  |
9947db96d56Sopenharmony_ci+------------------+-------------------------------------------+
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci.. _dom-accessor-methods:
9977db96d56Sopenharmony_ci
9987db96d56Sopenharmony_ciAccessor Methods
9997db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ciThe mapping from OMG IDL to Python defines accessor functions for IDL
10027db96d56Sopenharmony_ci``attribute`` declarations in much the way the Java mapping does.
10037db96d56Sopenharmony_ciMapping the IDL declarations ::
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_ci   readonly attribute string someValue;
10067db96d56Sopenharmony_ci            attribute string anotherValue;
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ciyields three accessor functions:  a "get" method for :attr:`someValue`
10097db96d56Sopenharmony_ci(:meth:`_get_someValue`), and "get" and "set" methods for :attr:`anotherValue`
10107db96d56Sopenharmony_ci(:meth:`_get_anotherValue` and :meth:`_set_anotherValue`).  The mapping, in
10117db96d56Sopenharmony_ciparticular, does not require that the IDL attributes are accessible as normal
10127db96d56Sopenharmony_ciPython attributes:  ``object.someValue`` is *not* required to work, and may
10137db96d56Sopenharmony_ciraise an :exc:`AttributeError`.
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ciThe Python DOM API, however, *does* require that normal attribute access work.
10167db96d56Sopenharmony_ciThis means that the typical surrogates generated by Python IDL compilers are not
10177db96d56Sopenharmony_cilikely to work, and wrapper objects may be needed on the client if the DOM
10187db96d56Sopenharmony_ciobjects are accessed via CORBA. While this does require some additional
10197db96d56Sopenharmony_ciconsideration for CORBA DOM clients, the implementers with experience using DOM
10207db96d56Sopenharmony_ciover CORBA from Python do not consider this a problem.  Attributes that are
10217db96d56Sopenharmony_cideclared ``readonly`` may not restrict write access in all DOM
10227db96d56Sopenharmony_ciimplementations.
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ciIn the Python DOM API, accessor functions are not required.  If provided, they
10257db96d56Sopenharmony_cishould take the form defined by the Python IDL mapping, but these methods are
10267db96d56Sopenharmony_ciconsidered unnecessary since the attributes are accessible directly from Python.
10277db96d56Sopenharmony_ci"Set" accessors should never be provided for ``readonly`` attributes.
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_ciThe IDL definitions do not fully embody the requirements of the W3C DOM API,
10307db96d56Sopenharmony_cisuch as the notion of certain objects, such as the return value of
10317db96d56Sopenharmony_ci:meth:`getElementsByTagName`, being "live".  The Python DOM API does not require
10327db96d56Sopenharmony_ciimplementations to enforce such requirements.
10337db96d56Sopenharmony_ci
1034