1 2:mod:`xml.dom` --- The Document Object Model API 3================================================ 4 5.. module:: xml.dom 6 :synopsis: Document Object Model API for Python. 7.. sectionauthor:: Paul Prescod <[email protected]> 8.. sectionauthor:: Martin v. Löwis <[email protected]> 9 10 11.. versionadded:: 2.0 12 13The Document Object Model, or "DOM," is a cross-language API from the World Wide 14Web Consortium (W3C) for accessing and modifying XML documents. A DOM 15implementation presents an XML document as a tree structure, or allows client 16code to build such a structure from scratch. It then gives access to the 17structure through a set of objects which provided well-known interfaces. 18 19The DOM is extremely useful for random-access applications. SAX only allows you 20a view of one bit of the document at a time. If you are looking at one SAX 21element, you have no access to another. If you are looking at a text node, you 22have no access to a containing element. When you write a SAX application, you 23need to keep track of your program's position in the document somewhere in your 24own code. SAX does not do it for you. Also, if you need to look ahead in the 25XML document, you are just out of luck. 26 27Some applications are simply impossible in an event driven model with no access 28to a tree. Of course you could build some sort of tree yourself in SAX events, 29but the DOM allows you to avoid writing that code. The DOM is a standard tree 30representation for XML data. 31 32The Document Object Model is being defined by the W3C in stages, or "levels" in 33their terminology. The Python mapping of the API is substantially based on the 34DOM Level 2 recommendation. 35 36.. XXX PyXML is dead... 37.. The mapping of the Level 3 specification, currently 38 only available in draft form, is being developed by the `Python XML Special 39 Interest Group <https://www.python.org/sigs/xml-sig/>`_ as part of the `PyXML 40 package <http://pyxml.sourceforge.net/>`_. Refer to the documentation bundled 41 with that package for information on the current state of DOM Level 3 support. 42 43.. What if your needs are somewhere between SAX and the DOM? Perhaps 44 you cannot afford to load the entire tree in memory but you find the 45 SAX model somewhat cumbersome and low-level. There is also a module 46 called xml.dom.pulldom that allows you to build trees of only the 47 parts of a document that you need structured access to. It also has 48 features that allow you to find your way around the DOM. 49 See http://www.prescod.net/python/pulldom 50 51DOM applications typically start by parsing some XML into a DOM. How this is 52accomplished is not covered at all by DOM Level 1, and Level 2 provides only 53limited improvements: There is a :class:`DOMImplementation` object class which 54provides access to :class:`Document` creation methods, but no way to access an 55XML reader/parser/Document builder in an implementation-independent way. There 56is also no well-defined way to access these methods without an existing 57:class:`Document` object. In Python, each DOM implementation will provide a 58function :func:`getDOMImplementation`. DOM Level 3 adds a Load/Store 59specification, which defines an interface to the reader, but this is not yet 60available in the Python standard library. 61 62Once you have a DOM document object, you can access the parts of your XML 63document through its properties and methods. These properties are defined in 64the DOM specification; this portion of the reference manual describes the 65interpretation of the specification in Python. 66 67The specification provided by the W3C defines the DOM API for Java, ECMAScript, 68and OMG IDL. The Python mapping defined here is based in large part on the IDL 69version of the specification, but strict compliance is not required (though 70implementations are free to support the strict mapping from IDL). See section 71:ref:`dom-conformance` for a detailed discussion of mapping requirements. 72 73 74.. seealso:: 75 76 `Document Object Model (DOM) Level 2 Specification <https://www.w3.org/TR/DOM-Level-2-Core/>`_ 77 The W3C recommendation upon which the Python DOM API is based. 78 79 `Document Object Model (DOM) Level 1 Specification <https://www.w3.org/TR/REC-DOM-Level-1/>`_ 80 The W3C recommendation for the DOM supported by :mod:`xml.dom.minidom`. 81 82 `Python Language Mapping Specification <http://www.omg.org/spec/PYTH/1.2/PDF>`_ 83 This specifies the mapping from OMG IDL to Python. 84 85 86Module Contents 87--------------- 88 89The :mod:`xml.dom` contains the following functions: 90 91 92.. function:: registerDOMImplementation(name, factory) 93 94 Register the *factory* function with the name *name*. The factory function 95 should return an object which implements the :class:`DOMImplementation` 96 interface. The factory function can return the same object every time, or a new 97 one for each call, as appropriate for the specific implementation (e.g. if that 98 implementation supports some customization). 99 100 101.. function:: getDOMImplementation([name[, features]]) 102 103 Return a suitable DOM implementation. The *name* is either well-known, the 104 module name of a DOM implementation, or ``None``. If it is not ``None``, imports 105 the corresponding module and returns a :class:`DOMImplementation` object if the 106 import succeeds. If no name is given, and if the environment variable 107 :envvar:`PYTHON_DOM` is set, this variable is used to find the implementation. 108 109 If name is not given, this examines the available implementations to find one 110 with the required feature set. If no implementation can be found, raise an 111 :exc:`ImportError`. The features list must be a sequence of ``(feature, 112 version)`` pairs which are passed to the :meth:`hasFeature` method on available 113 :class:`DOMImplementation` objects. 114 115Some convenience constants are also provided: 116 117 118.. data:: EMPTY_NAMESPACE 119 120 The value used to indicate that no namespace is associated with a node in the 121 DOM. This is typically found as the :attr:`namespaceURI` of a node, or used as 122 the *namespaceURI* parameter to a namespaces-specific method. 123 124 .. versionadded:: 2.2 125 126 127.. data:: XML_NAMESPACE 128 129 The namespace URI associated with the reserved prefix ``xml``, as defined by 130 `Namespaces in XML <https://www.w3.org/TR/REC-xml-names/>`_ (section 4). 131 132 .. versionadded:: 2.2 133 134 135.. data:: XMLNS_NAMESPACE 136 137 The namespace URI for namespace declarations, as defined by `Document Object 138 Model (DOM) Level 2 Core Specification 139 <https://www.w3.org/TR/DOM-Level-2-Core/core.html>`_ (section 1.1.8). 140 141 .. versionadded:: 2.2 142 143 144.. data:: XHTML_NAMESPACE 145 146 The URI of the XHTML namespace as defined by `XHTML 1.0: The Extensible 147 HyperText Markup Language <https://www.w3.org/TR/xhtml1/>`_ (section 3.1.1). 148 149 .. versionadded:: 2.2 150 151In addition, :mod:`xml.dom` contains a base :class:`Node` class and the DOM 152exception classes. The :class:`Node` class provided by this module does not 153implement any of the methods or attributes defined by the DOM specification; 154concrete DOM implementations must provide those. The :class:`Node` class 155provided as part of this module does provide the constants used for the 156:attr:`nodeType` attribute on concrete :class:`Node` objects; they are located 157within the class rather than at the module level to conform with the DOM 158specifications. 159 160.. Should the Node documentation go here? 161 162 163.. _dom-objects: 164 165Objects in the DOM 166------------------ 167 168The definitive documentation for the DOM is the DOM specification from the W3C. 169 170Note that DOM attributes may also be manipulated as nodes instead of as simple 171strings. It is fairly rare that you must do this, however, so this usage is not 172yet documented. 173 174+--------------------------------+-----------------------------------+---------------------------------+ 175| Interface | Section | Purpose | 176+================================+===================================+=================================+ 177| :class:`DOMImplementation` | :ref:`dom-implementation-objects` | Interface to the underlying | 178| | | implementation. | 179+--------------------------------+-----------------------------------+---------------------------------+ 180| :class:`Node` | :ref:`dom-node-objects` | Base interface for most objects | 181| | | in a document. | 182+--------------------------------+-----------------------------------+---------------------------------+ 183| :class:`NodeList` | :ref:`dom-nodelist-objects` | Interface for a sequence of | 184| | | nodes. | 185+--------------------------------+-----------------------------------+---------------------------------+ 186| :class:`DocumentType` | :ref:`dom-documenttype-objects` | Information about the | 187| | | declarations needed to process | 188| | | a document. | 189+--------------------------------+-----------------------------------+---------------------------------+ 190| :class:`Document` | :ref:`dom-document-objects` | Object which represents an | 191| | | entire document. | 192+--------------------------------+-----------------------------------+---------------------------------+ 193| :class:`Element` | :ref:`dom-element-objects` | Element nodes in the document | 194| | | hierarchy. | 195+--------------------------------+-----------------------------------+---------------------------------+ 196| :class:`Attr` | :ref:`dom-attr-objects` | Attribute value nodes on | 197| | | element nodes. | 198+--------------------------------+-----------------------------------+---------------------------------+ 199| :class:`Comment` | :ref:`dom-comment-objects` | Representation of comments in | 200| | | the source document. | 201+--------------------------------+-----------------------------------+---------------------------------+ 202| :class:`Text` | :ref:`dom-text-objects` | Nodes containing textual | 203| | | content from the document. | 204+--------------------------------+-----------------------------------+---------------------------------+ 205| :class:`ProcessingInstruction` | :ref:`dom-pi-objects` | Processing instruction | 206| | | representation. | 207+--------------------------------+-----------------------------------+---------------------------------+ 208 209An additional section describes the exceptions defined for working with the DOM 210in Python. 211 212 213.. _dom-implementation-objects: 214 215DOMImplementation Objects 216^^^^^^^^^^^^^^^^^^^^^^^^^ 217 218The :class:`DOMImplementation` interface provides a way for applications to 219determine the availability of particular features in the DOM they are using. 220DOM Level 2 added the ability to create new :class:`Document` and 221:class:`DocumentType` objects using the :class:`DOMImplementation` as well. 222 223 224.. method:: DOMImplementation.hasFeature(feature, version) 225 226 Return true if the feature identified by the pair of strings *feature* and 227 *version* is implemented. 228 229 230.. method:: DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype) 231 232 Return a new :class:`Document` object (the root of the DOM), with a child 233 :class:`Element` object having the given *namespaceUri* and *qualifiedName*. The 234 *doctype* must be a :class:`DocumentType` object created by 235 :meth:`createDocumentType`, or ``None``. In the Python DOM API, the first two 236 arguments can also be ``None`` in order to indicate that no :class:`Element` 237 child is to be created. 238 239 240.. method:: DOMImplementation.createDocumentType(qualifiedName, publicId, systemId) 241 242 Return a new :class:`DocumentType` object that encapsulates the given 243 *qualifiedName*, *publicId*, and *systemId* strings, representing the 244 information contained in an XML document type declaration. 245 246 247.. _dom-node-objects: 248 249Node Objects 250^^^^^^^^^^^^ 251 252All of the components of an XML document are subclasses of :class:`Node`. 253 254 255.. attribute:: Node.nodeType 256 257 An integer representing the node type. Symbolic constants for the types are on 258 the :class:`Node` object: :const:`ELEMENT_NODE`, :const:`ATTRIBUTE_NODE`, 259 :const:`TEXT_NODE`, :const:`CDATA_SECTION_NODE`, :const:`ENTITY_NODE`, 260 :const:`PROCESSING_INSTRUCTION_NODE`, :const:`COMMENT_NODE`, 261 :const:`DOCUMENT_NODE`, :const:`DOCUMENT_TYPE_NODE`, :const:`NOTATION_NODE`. 262 This is a read-only attribute. 263 264 265.. attribute:: Node.parentNode 266 267 The parent of the current node, or ``None`` for the document node. The value is 268 always a :class:`Node` object or ``None``. For :class:`Element` nodes, this 269 will be the parent element, except for the root element, in which case it will 270 be the :class:`Document` object. For :class:`Attr` nodes, this is always 271 ``None``. This is a read-only attribute. 272 273 274.. attribute:: Node.attributes 275 276 A :class:`NamedNodeMap` of attribute objects. Only elements have actual values 277 for this; others provide ``None`` for this attribute. This is a read-only 278 attribute. 279 280 281.. attribute:: Node.previousSibling 282 283 The node that immediately precedes this one with the same parent. For 284 instance the element with an end-tag that comes just before the *self* 285 element's start-tag. Of course, XML documents are made up of more than just 286 elements so the previous sibling could be text, a comment, or something else. 287 If this node is the first child of the parent, this attribute will be 288 ``None``. This is a read-only attribute. 289 290 291.. attribute:: Node.nextSibling 292 293 The node that immediately follows this one with the same parent. See also 294 :attr:`previousSibling`. If this is the last child of the parent, this 295 attribute will be ``None``. This is a read-only attribute. 296 297 298.. attribute:: Node.childNodes 299 300 A list of nodes contained within this node. This is a read-only attribute. 301 302 303.. attribute:: Node.firstChild 304 305 The first child of the node, if there are any, or ``None``. This is a read-only 306 attribute. 307 308 309.. attribute:: Node.lastChild 310 311 The last child of the node, if there are any, or ``None``. This is a read-only 312 attribute. 313 314 315.. attribute:: Node.localName 316 317 The part of the :attr:`tagName` following the colon if there is one, else the 318 entire :attr:`tagName`. The value is a string. 319 320 321.. attribute:: Node.prefix 322 323 The part of the :attr:`tagName` preceding the colon if there is one, else the 324 empty string. The value is a string, or ``None``. 325 326 327.. attribute:: Node.namespaceURI 328 329 The namespace associated with the element name. This will be a string or 330 ``None``. This is a read-only attribute. 331 332 333.. attribute:: Node.nodeName 334 335 This has a different meaning for each node type; see the DOM specification for 336 details. You can always get the information you would get here from another 337 property such as the :attr:`tagName` property for elements or the :attr:`name` 338 property for attributes. For all node types, the value of this attribute will be 339 either a string or ``None``. This is a read-only attribute. 340 341 342.. attribute:: Node.nodeValue 343 344 This has a different meaning for each node type; see the DOM specification for 345 details. The situation is similar to that with :attr:`nodeName`. The value is 346 a string or ``None``. 347 348 349.. method:: Node.hasAttributes() 350 351 Returns true if the node has any attributes. 352 353 354.. method:: Node.hasChildNodes() 355 356 Returns true if the node has any child nodes. 357 358 359.. method:: Node.isSameNode(other) 360 361 Returns true if *other* refers to the same node as this node. This is especially 362 useful for DOM implementations which use any sort of proxy architecture (because 363 more than one object can refer to the same node). 364 365 .. note:: 366 367 This is based on a proposed DOM Level 3 API which is still in the "working 368 draft" stage, but this particular interface appears uncontroversial. Changes 369 from the W3C will not necessarily affect this method in the Python DOM interface 370 (though any new W3C API for this would also be supported). 371 372 373.. method:: Node.appendChild(newChild) 374 375 Add a new child node to this node at the end of the list of 376 children, returning *newChild*. If the node was already in 377 the tree, it is removed first. 378 379 380.. method:: Node.insertBefore(newChild, refChild) 381 382 Insert a new child node before an existing child. It must be the case that 383 *refChild* is a child of this node; if not, :exc:`ValueError` is raised. 384 *newChild* is returned. If *refChild* is ``None``, it inserts *newChild* at the 385 end of the children's list. 386 387 388.. method:: Node.removeChild(oldChild) 389 390 Remove a child node. *oldChild* must be a child of this node; if not, 391 :exc:`ValueError` is raised. *oldChild* is returned on success. If *oldChild* 392 will not be used further, its :meth:`unlink` method should be called. 393 394 395.. method:: Node.replaceChild(newChild, oldChild) 396 397 Replace an existing node with a new node. It must be the case that *oldChild* 398 is a child of this node; if not, :exc:`ValueError` is raised. 399 400 401.. method:: Node.normalize() 402 403 Join adjacent text nodes so that all stretches of text are stored as single 404 :class:`Text` instances. This simplifies processing text from a DOM tree for 405 many applications. 406 407 .. versionadded:: 2.1 408 409 410.. method:: Node.cloneNode(deep) 411 412 Clone this node. Setting *deep* means to clone all child nodes as well. This 413 returns the clone. 414 415 416.. _dom-nodelist-objects: 417 418NodeList Objects 419^^^^^^^^^^^^^^^^ 420 421A :class:`NodeList` represents a sequence of nodes. These objects are used in 422two ways in the DOM Core recommendation: an :class:`Element` object provides 423one as its list of child nodes, and the :meth:`getElementsByTagName` and 424:meth:`getElementsByTagNameNS` methods of :class:`Node` return objects with this 425interface to represent query results. 426 427The DOM Level 2 recommendation defines one method and one attribute for these 428objects: 429 430 431.. method:: NodeList.item(i) 432 433 Return the *i*'th item from the sequence, if there is one, or ``None``. The 434 index *i* is not allowed to be less than zero or greater than or equal to the 435 length of the sequence. 436 437 438.. attribute:: NodeList.length 439 440 The number of nodes in the sequence. 441 442In addition, the Python DOM interface requires that some additional support is 443provided to allow :class:`NodeList` objects to be used as Python sequences. All 444:class:`NodeList` implementations must include support for 445:meth:`~object.__len__` and 446:meth:`~object.__getitem__`; this allows iteration over the :class:`NodeList` in 447:keyword:`for` statements and proper support for the :func:`len` built-in 448function. 449 450If a DOM implementation supports modification of the document, the 451:class:`NodeList` implementation must also support the 452:meth:`~object.__setitem__` and :meth:`~object.__delitem__` methods. 453 454 455.. _dom-documenttype-objects: 456 457DocumentType Objects 458^^^^^^^^^^^^^^^^^^^^ 459 460Information about the notations and entities declared by a document (including 461the external subset if the parser uses it and can provide the information) is 462available from a :class:`DocumentType` object. The :class:`DocumentType` for a 463document is available from the :class:`Document` object's :attr:`doctype` 464attribute; if there is no ``DOCTYPE`` declaration for the document, the 465document's :attr:`doctype` attribute will be set to ``None`` instead of an 466instance of this interface. 467 468:class:`DocumentType` is a specialization of :class:`Node`, and adds the 469following attributes: 470 471 472.. attribute:: DocumentType.publicId 473 474 The public identifier for the external subset of the document type definition. 475 This will be a string or ``None``. 476 477 478.. attribute:: DocumentType.systemId 479 480 The system identifier for the external subset of the document type definition. 481 This will be a URI as a string, or ``None``. 482 483 484.. attribute:: DocumentType.internalSubset 485 486 A string giving the complete internal subset from the document. This does not 487 include the brackets which enclose the subset. If the document has no internal 488 subset, this should be ``None``. 489 490 491.. attribute:: DocumentType.name 492 493 The name of the root element as given in the ``DOCTYPE`` declaration, if 494 present. 495 496 497.. attribute:: DocumentType.entities 498 499 This is a :class:`NamedNodeMap` giving the definitions of external entities. 500 For entity names defined more than once, only the first definition is provided 501 (others are ignored as required by the XML recommendation). This may be 502 ``None`` if the information is not provided by the parser, or if no entities are 503 defined. 504 505 506.. attribute:: DocumentType.notations 507 508 This is a :class:`NamedNodeMap` giving the definitions of notations. For 509 notation names defined more than once, only the first definition is provided 510 (others are ignored as required by the XML recommendation). This may be 511 ``None`` if the information is not provided by the parser, or if no notations 512 are defined. 513 514 515.. _dom-document-objects: 516 517Document Objects 518^^^^^^^^^^^^^^^^ 519 520A :class:`Document` represents an entire XML document, including its constituent 521elements, attributes, processing instructions, comments etc. Remember that it 522inherits properties from :class:`Node`. 523 524 525.. attribute:: Document.documentElement 526 527 The one and only root element of the document. 528 529 530.. method:: Document.createElement(tagName) 531 532 Create and return a new element node. The element is not inserted into the 533 document when it is created. You need to explicitly insert it with one of the 534 other methods such as :meth:`insertBefore` or :meth:`appendChild`. 535 536 537.. method:: Document.createElementNS(namespaceURI, tagName) 538 539 Create and return a new element with a namespace. The *tagName* may have a 540 prefix. The element is not inserted into the document when it is created. You 541 need to explicitly insert it with one of the other methods such as 542 :meth:`insertBefore` or :meth:`appendChild`. 543 544 545.. method:: Document.createTextNode(data) 546 547 Create and return a text node containing the data passed as a parameter. As 548 with the other creation methods, this one does not insert the node into the 549 tree. 550 551 552.. method:: Document.createComment(data) 553 554 Create and return a comment node containing the data passed as a parameter. As 555 with the other creation methods, this one does not insert the node into the 556 tree. 557 558 559.. method:: Document.createProcessingInstruction(target, data) 560 561 Create and return a processing instruction node containing the *target* and 562 *data* passed as parameters. As with the other creation methods, this one does 563 not insert the node into the tree. 564 565 566.. method:: Document.createAttribute(name) 567 568 Create and return an attribute node. This method does not associate the 569 attribute node with any particular element. You must use 570 :meth:`setAttributeNode` on the appropriate :class:`Element` object to use the 571 newly created attribute instance. 572 573 574.. method:: Document.createAttributeNS(namespaceURI, qualifiedName) 575 576 Create and return an attribute node with a namespace. The *tagName* may have a 577 prefix. This method does not associate the attribute node with any particular 578 element. You must use :meth:`setAttributeNode` on the appropriate 579 :class:`Element` object to use the newly created attribute instance. 580 581 582.. method:: Document.getElementsByTagName(tagName) 583 584 Search for all descendants (direct children, children's children, etc.) with a 585 particular element type name. 586 587 588.. method:: Document.getElementsByTagNameNS(namespaceURI, localName) 589 590 Search for all descendants (direct children, children's children, etc.) with a 591 particular namespace URI and localname. The localname is the part of the 592 namespace after the prefix. 593 594 595.. _dom-element-objects: 596 597Element Objects 598^^^^^^^^^^^^^^^ 599 600:class:`Element` is a subclass of :class:`Node`, so inherits all the attributes 601of that class. 602 603 604.. attribute:: Element.tagName 605 606 The element type name. In a namespace-using document it may have colons in it. 607 The value is a string. 608 609 610.. method:: Element.getElementsByTagName(tagName) 611 612 Same as equivalent method in the :class:`Document` class. 613 614 615.. method:: Element.getElementsByTagNameNS(namespaceURI, localName) 616 617 Same as equivalent method in the :class:`Document` class. 618 619 620.. method:: Element.hasAttribute(name) 621 622 Returns true if the element has an attribute named by *name*. 623 624 625.. method:: Element.hasAttributeNS(namespaceURI, localName) 626 627 Returns true if the element has an attribute named by *namespaceURI* and 628 *localName*. 629 630 631.. method:: Element.getAttribute(name) 632 633 Return the value of the attribute named by *name* as a string. If no such 634 attribute exists, an empty string is returned, as if the attribute had no value. 635 636 637.. method:: Element.getAttributeNode(attrname) 638 639 Return the :class:`Attr` node for the attribute named by *attrname*. 640 641 642.. method:: Element.getAttributeNS(namespaceURI, localName) 643 644 Return the value of the attribute named by *namespaceURI* and *localName* as a 645 string. If no such attribute exists, an empty string is returned, as if the 646 attribute had no value. 647 648 649.. method:: Element.getAttributeNodeNS(namespaceURI, localName) 650 651 Return an attribute value as a node, given a *namespaceURI* and *localName*. 652 653 654.. method:: Element.removeAttribute(name) 655 656 Remove an attribute by name. If there is no matching attribute, a 657 :exc:`NotFoundErr` is raised. 658 659 660.. method:: Element.removeAttributeNode(oldAttr) 661 662 Remove and return *oldAttr* from the attribute list, if present. If *oldAttr* is 663 not present, :exc:`NotFoundErr` is raised. 664 665 666.. method:: Element.removeAttributeNS(namespaceURI, localName) 667 668 Remove an attribute by name. Note that it uses a localName, not a qname. No 669 exception is raised if there is no matching attribute. 670 671 672.. method:: Element.setAttribute(name, value) 673 674 Set an attribute value from a string. 675 676 677.. method:: Element.setAttributeNode(newAttr) 678 679 Add a new attribute node to the element, replacing an existing attribute if 680 necessary if the :attr:`name` attribute matches. If a replacement occurs, the 681 old attribute node will be returned. If *newAttr* is already in use, 682 :exc:`InuseAttributeErr` will be raised. 683 684 685.. method:: Element.setAttributeNodeNS(newAttr) 686 687 Add a new attribute node to the element, replacing an existing attribute if 688 necessary if the :attr:`namespaceURI` and :attr:`localName` attributes match. 689 If a replacement occurs, the old attribute node will be returned. If *newAttr* 690 is already in use, :exc:`InuseAttributeErr` will be raised. 691 692 693.. method:: Element.setAttributeNS(namespaceURI, qname, value) 694 695 Set an attribute value from a string, given a *namespaceURI* and a *qname*. 696 Note that a qname is the whole attribute name. This is different than above. 697 698 699.. _dom-attr-objects: 700 701Attr Objects 702^^^^^^^^^^^^ 703 704:class:`Attr` inherits from :class:`Node`, so inherits all its attributes. 705 706 707.. attribute:: Attr.name 708 709 The attribute name. 710 In a namespace-using document it may include a colon. 711 712 713.. attribute:: Attr.localName 714 715 The part of the name following the colon if there is one, else the 716 entire name. 717 This is a read-only attribute. 718 719 720.. attribute:: Attr.prefix 721 722 The part of the name preceding the colon if there is one, else the 723 empty string. 724 725 726.. attribute:: Attr.value 727 728 The text value of the attribute. This is a synonym for the 729 :attr:`nodeValue` attribute. 730 731 732.. _dom-attributelist-objects: 733 734NamedNodeMap Objects 735^^^^^^^^^^^^^^^^^^^^ 736 737:class:`NamedNodeMap` does *not* inherit from :class:`Node`. 738 739 740.. attribute:: NamedNodeMap.length 741 742 The length of the attribute list. 743 744 745.. method:: NamedNodeMap.item(index) 746 747 Return an attribute with a particular index. The order you get the attributes 748 in is arbitrary but will be consistent for the life of a DOM. Each item is an 749 attribute node. Get its value with the :attr:`value` attribute. 750 751There are also experimental methods that give this class more mapping behavior. 752You can use them or you can use the standardized :meth:`getAttribute\*` family 753of methods on the :class:`Element` objects. 754 755 756.. _dom-comment-objects: 757 758Comment Objects 759^^^^^^^^^^^^^^^ 760 761:class:`Comment` represents a comment in the XML document. It is a subclass of 762:class:`Node`, but cannot have child nodes. 763 764 765.. attribute:: Comment.data 766 767 The content of the comment as a string. The attribute contains all characters 768 between the leading ``<!-``\ ``-`` and trailing ``-``\ ``->``, but does not 769 include them. 770 771 772.. _dom-text-objects: 773 774Text and CDATASection Objects 775^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 776 777The :class:`Text` interface represents text in the XML document. If the parser 778and DOM implementation support the DOM's XML extension, portions of the text 779enclosed in CDATA marked sections are stored in :class:`CDATASection` objects. 780These two interfaces are identical, but provide different values for the 781:attr:`nodeType` attribute. 782 783These interfaces extend the :class:`Node` interface. They cannot have child 784nodes. 785 786 787.. attribute:: Text.data 788 789 The content of the text node as a string. 790 791.. note:: 792 793 The use of a :class:`CDATASection` node does not indicate that the node 794 represents a complete CDATA marked section, only that the content of the node 795 was part of a CDATA section. A single CDATA section may be represented by more 796 than one node in the document tree. There is no way to determine whether two 797 adjacent :class:`CDATASection` nodes represent different CDATA marked sections. 798 799 800.. _dom-pi-objects: 801 802ProcessingInstruction Objects 803^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 804 805Represents a processing instruction in the XML document; this inherits from the 806:class:`Node` interface and cannot have child nodes. 807 808 809.. attribute:: ProcessingInstruction.target 810 811 The content of the processing instruction up to the first whitespace character. 812 This is a read-only attribute. 813 814 815.. attribute:: ProcessingInstruction.data 816 817 The content of the processing instruction following the first whitespace 818 character. 819 820 821.. _dom-exceptions: 822 823Exceptions 824^^^^^^^^^^ 825 826.. versionadded:: 2.1 827 828The DOM Level 2 recommendation defines a single exception, :exc:`DOMException`, 829and a number of constants that allow applications to determine what sort of 830error occurred. :exc:`DOMException` instances carry a :attr:`code` attribute 831that provides the appropriate value for the specific exception. 832 833The Python DOM interface provides the constants, but also expands the set of 834exceptions so that a specific exception exists for each of the exception codes 835defined by the DOM. The implementations must raise the appropriate specific 836exception, each of which carries the appropriate value for the :attr:`code` 837attribute. 838 839 840.. exception:: DOMException 841 842 Base exception class used for all specific DOM exceptions. This exception class 843 cannot be directly instantiated. 844 845 846.. exception:: DomstringSizeErr 847 848 Raised when a specified range of text does not fit into a string. This is not 849 known to be used in the Python DOM implementations, but may be received from DOM 850 implementations not written in Python. 851 852 853.. exception:: HierarchyRequestErr 854 855 Raised when an attempt is made to insert a node where the node type is not 856 allowed. 857 858 859.. exception:: IndexSizeErr 860 861 Raised when an index or size parameter to a method is negative or exceeds the 862 allowed values. 863 864 865.. exception:: InuseAttributeErr 866 867 Raised when an attempt is made to insert an :class:`Attr` node that is already 868 present elsewhere in the document. 869 870 871.. exception:: InvalidAccessErr 872 873 Raised if a parameter or an operation is not supported on the underlying object. 874 875 876.. exception:: InvalidCharacterErr 877 878 This exception is raised when a string parameter contains a character that is 879 not permitted in the context it's being used in by the XML 1.0 recommendation. 880 For example, attempting to create an :class:`Element` node with a space in the 881 element type name will cause this error to be raised. 882 883 884.. exception:: InvalidModificationErr 885 886 Raised when an attempt is made to modify the type of a node. 887 888 889.. exception:: InvalidStateErr 890 891 Raised when an attempt is made to use an object that is not defined or is no 892 longer usable. 893 894 895.. exception:: NamespaceErr 896 897 If an attempt is made to change any object in a way that is not permitted with 898 regard to the `Namespaces in XML <https://www.w3.org/TR/REC-xml-names/>`_ 899 recommendation, this exception is raised. 900 901 902.. exception:: NotFoundErr 903 904 Exception when a node does not exist in the referenced context. For example, 905 :meth:`NamedNodeMap.removeNamedItem` will raise this if the node passed in does 906 not exist in the map. 907 908 909.. exception:: NotSupportedErr 910 911 Raised when the implementation does not support the requested type of object or 912 operation. 913 914 915.. exception:: NoDataAllowedErr 916 917 This is raised if data is specified for a node which does not support data. 918 919 .. XXX a better explanation is needed! 920 921 922.. exception:: NoModificationAllowedErr 923 924 Raised on attempts to modify an object where modifications are not allowed (such 925 as for read-only nodes). 926 927 928.. exception:: SyntaxErr 929 930 Raised when an invalid or illegal string is specified. 931 932 .. XXX how is this different from InvalidCharacterErr? 933 934 935.. exception:: WrongDocumentErr 936 937 Raised when a node is inserted in a different document than it currently belongs 938 to, and the implementation does not support migrating the node from one document 939 to the other. 940 941The exception codes defined in the DOM recommendation map to the exceptions 942described above according to this table: 943 944+--------------------------------------+---------------------------------+ 945| Constant | Exception | 946+======================================+=================================+ 947| :const:`DOMSTRING_SIZE_ERR` | :exc:`DomstringSizeErr` | 948+--------------------------------------+---------------------------------+ 949| :const:`HIERARCHY_REQUEST_ERR` | :exc:`HierarchyRequestErr` | 950+--------------------------------------+---------------------------------+ 951| :const:`INDEX_SIZE_ERR` | :exc:`IndexSizeErr` | 952+--------------------------------------+---------------------------------+ 953| :const:`INUSE_ATTRIBUTE_ERR` | :exc:`InuseAttributeErr` | 954+--------------------------------------+---------------------------------+ 955| :const:`INVALID_ACCESS_ERR` | :exc:`InvalidAccessErr` | 956+--------------------------------------+---------------------------------+ 957| :const:`INVALID_CHARACTER_ERR` | :exc:`InvalidCharacterErr` | 958+--------------------------------------+---------------------------------+ 959| :const:`INVALID_MODIFICATION_ERR` | :exc:`InvalidModificationErr` | 960+--------------------------------------+---------------------------------+ 961| :const:`INVALID_STATE_ERR` | :exc:`InvalidStateErr` | 962+--------------------------------------+---------------------------------+ 963| :const:`NAMESPACE_ERR` | :exc:`NamespaceErr` | 964+--------------------------------------+---------------------------------+ 965| :const:`NOT_FOUND_ERR` | :exc:`NotFoundErr` | 966+--------------------------------------+---------------------------------+ 967| :const:`NOT_SUPPORTED_ERR` | :exc:`NotSupportedErr` | 968+--------------------------------------+---------------------------------+ 969| :const:`NO_DATA_ALLOWED_ERR` | :exc:`NoDataAllowedErr` | 970+--------------------------------------+---------------------------------+ 971| :const:`NO_MODIFICATION_ALLOWED_ERR` | :exc:`NoModificationAllowedErr` | 972+--------------------------------------+---------------------------------+ 973| :const:`SYNTAX_ERR` | :exc:`SyntaxErr` | 974+--------------------------------------+---------------------------------+ 975| :const:`WRONG_DOCUMENT_ERR` | :exc:`WrongDocumentErr` | 976+--------------------------------------+---------------------------------+ 977 978 979.. _dom-conformance: 980 981Conformance 982----------- 983 984This section describes the conformance requirements and relationships between 985the Python DOM API, the W3C DOM recommendations, and the OMG IDL mapping for 986Python. 987 988 989.. _dom-type-mapping: 990 991Type Mapping 992^^^^^^^^^^^^ 993 994The primitive IDL types used in the DOM specification are mapped to Python types 995according to the following table. 996 997+------------------+-------------------------------------------+ 998| IDL Type | Python Type | 999+==================+===========================================+ 1000| ``boolean`` | ``IntegerType`` (with a value of ``0`` or | 1001| | ``1``) | 1002+------------------+-------------------------------------------+ 1003| ``int`` | ``IntegerType`` | 1004+------------------+-------------------------------------------+ 1005| ``long int`` | ``IntegerType`` | 1006+------------------+-------------------------------------------+ 1007| ``unsigned int`` | ``IntegerType`` | 1008+------------------+-------------------------------------------+ 1009 1010Additionally, the :class:`DOMString` defined in the recommendation is mapped to 1011a Python string or Unicode string. Applications should be able to handle 1012Unicode whenever a string is returned from the DOM. 1013 1014The IDL ``null`` value is mapped to ``None``, which may be accepted or 1015provided by the implementation whenever ``null`` is allowed by the API. 1016 1017 1018.. _dom-accessor-methods: 1019 1020Accessor Methods 1021^^^^^^^^^^^^^^^^ 1022 1023The mapping from OMG IDL to Python defines accessor functions for IDL 1024``attribute`` declarations in much the way the Java mapping does. 1025Mapping the IDL declarations :: 1026 1027 readonly attribute string someValue; 1028 attribute string anotherValue; 1029 1030yields three accessor functions: a "get" method for :attr:`someValue` 1031(:meth:`_get_someValue`), and "get" and "set" methods for :attr:`anotherValue` 1032(:meth:`_get_anotherValue` and :meth:`_set_anotherValue`). The mapping, in 1033particular, does not require that the IDL attributes are accessible as normal 1034Python attributes: ``object.someValue`` is *not* required to work, and may 1035raise an :exc:`AttributeError`. 1036 1037The Python DOM API, however, *does* require that normal attribute access work. 1038This means that the typical surrogates generated by Python IDL compilers are not 1039likely to work, and wrapper objects may be needed on the client if the DOM 1040objects are accessed via CORBA. While this does require some additional 1041consideration for CORBA DOM clients, the implementers with experience using DOM 1042over CORBA from Python do not consider this a problem. Attributes that are 1043declared ``readonly`` may not restrict write access in all DOM 1044implementations. 1045 1046In the Python DOM API, accessor functions are not required. If provided, they 1047should take the form defined by the Python IDL mapping, but these methods are 1048considered unnecessary since the attributes are accessible directly from Python. 1049"Set" accessors should never be provided for ``readonly`` attributes. 1050 1051The IDL definitions do not fully embody the requirements of the W3C DOM API, 1052such as the notion of certain objects, such as the return value of 1053:meth:`getElementsByTagName`, being "live". The Python DOM API does not require 1054implementations to enforce such requirements. 1055 1056