Index: Doc/library/xml.etree.elementtree.rst =================================================================== --- Doc/library/xml.etree.elementtree.rst (revision 76727) +++ Doc/library/xml.etree.elementtree.rst (working copy) @@ -26,7 +26,8 @@ * a number of child elements, stored in a Python sequence -To create an element instance, use the Element or SubElement factory functions. +To create an element instance, use the :class:`Element` constructor or the +:func:`SubElement` factory function. The :class:`ElementTree` class can be used to wrap an element structure, and convert it from and to XML. @@ -46,9 +47,10 @@ .. function:: Comment([text]) Comment element factory. This factory function creates a special element that - will be serialized as an XML comment. The comment string can be either an 8-bit - ASCII string or a Unicode string. *text* is a string containing the comment - string. Returns an element instance representing a comment. + will be serialized as an XML comment by the standard serializer. The comment + string can be either an 8-bit ASCII string or a Unicode string. *text* is a + string containing the comment string. Returns an element instance representing + a comment. .. function:: dump(elem) @@ -62,23 +64,20 @@ *elem* is an element tree or an individual element. -.. function:: Element(tag[, attrib][, **extra]) +.. function:: fromstring(text) - Element factory. This function returns an object implementing the standard - Element interface. The exact class or type of that object is implementation - dependent, but it will always be compatible with the _ElementInterface class in - this module. + Parses an XML section from a string constant. Same as XML. *text* is a string + containing XML data. Returns an Element instance. - The element name, attribute names, and attribute values can be either 8-bit - ASCII strings or Unicode strings. *tag* is the element name. *attrib* is an - optional dictionary, containing element attributes. *extra* contains additional - attributes, given as keyword arguments. Returns an element instance. +.. function:: fromstringlist(sequence[, parser]) -.. function:: fromstring(text) + Parses an XML document from a sequence of string fragments. *sequence* is a list + or other sequence containing XML data fragments. *parser* is an optional parser + instance. If not given, the standard :class:`XMLParser` parser is used. + Returns an Element instance. - Parses an XML section from a string constant. Same as XML. *text* is a string - containing XML data. Returns an Element instance. + .. versionadded:: 2.7 .. function:: iselement(element) @@ -87,12 +86,14 @@ element instance. Returns a true value if this is an element object. -.. function:: iterparse(source[, events]) +.. function:: iterparse(source[, events[, parser]]) Parses an XML section into an element tree incrementally, and reports what's going on to the user. *source* is a filename or file object containing XML data. *events* is a list of events to report back. If omitted, only "end" events are - reported. Returns an :term:`iterator` providing ``(event, elem)`` pairs. + reported. *parser* is an optional parser instance. If not given, the standard + :class:`XMLParser` parser is used. Returns an :term:`iterator` + providing ``(event, elem)`` pairs. .. note:: @@ -109,8 +110,8 @@ Parses an XML section into an element tree. *source* is a filename or file object containing XML data. *parser* is an optional parser instance. If not - given, the standard XMLTreeBuilder parser is used. Returns an ElementTree - instance. + given, the standard :class:`XMLParser` parser is used. Returns an + :class:`ElementTree` instance. .. function:: ProcessingInstruction(target[, text]) @@ -121,6 +122,16 @@ an element instance, representing a processing instruction. +.. function:: register_namespace(prefix, uri) + + Registers a namespace prefix. The registry is global, and any existing mapping + for either the given prefix or the namespace URI will be removed. *prefix* is a + namespace prefix. *uri* is a namespace uri. Tags and attributes in this namespace + will be serialized with the given prefix, if at all possible. + + .. versionadded:: 2.7 + + .. function:: SubElement(parent, tag[, attrib[, **extra]]) Subelement factory. This function creates an element instance, and appends it @@ -140,163 +151,201 @@ US-ASCII). Returns an encoded string containing the XML data. -.. function:: XML(text) +.. function:: tostringlist(element[, encoding]) + + Generates a string representation of an XML element, including all subelements. + *element* is an Element instance. *encoding* is the output encoding (default is + US-ASCII). Returns a sequence object containing the XML data. + + .. versionadded:: 2.7 + + +.. function:: XML(text[, parser]) Parses an XML section from a string constant. This function can be used to embed "XML literals" in Python code. *text* is a string containing XML data. - Returns an Element instance. + *parser* is an optional parser instance. If not given, the standard + :class:`XMLParser` parser is used. Returns an Element instance. -.. function:: XMLID(text) +.. function:: XMLID(text[, parser]) Parses an XML section from a string constant, and also returns a dictionary which maps from element id:s to elements. *text* is a string containing XML - data. Returns a tuple containing an Element instance and a dictionary. + data. *parser* is an optional parser instance. If not given, the standard + :class:`XMLParser` parser is used. Returns a tuple containing an Element + instance and a dictionary. + + +.. _elementtree-element-objects: + +Element Objects +--------------- -.. _elementtree-element-interface: +.. class:: Element(tag[, attrib[, **extra]]) -The Element Interface ---------------------- + Element class. This class defines the Element interface, and provides a + reference implementation of this interface. -Element objects returned by Element or SubElement have the following methods -and attributes. + The element name, attribute names, and attribute values can be either 8-bit + ASCII strings or Unicode strings. *tag* is the element name. *attrib* is an + optional dictionary, containing element attributes. *extra* contains additional + attributes, given as keyword arguments. + + + .. attribute:: tag + + A string identifying what kind of data this element represents (the element + type, in other words). -.. attribute:: Element.tag + .. attribute:: text - A string identifying what kind of data this element represents (the element - type, in other words). + The *text* attribute can be used to hold additional data associated with the + element. As the name implies this attribute is usually a string but may be + any application-specific object. If the element is created from an XML file + the attribute will contain any text found between the element tags. -.. attribute:: Element.text + .. attribute:: tail - The *text* attribute can be used to hold additional data associated with the - element. As the name implies this attribute is usually a string but may be any - application-specific object. If the element is created from an XML file the - attribute will contain any text found between the element tags. + The *tail* attribute can be used to hold additional data associated with the + element. This attribute is usually a string but may be any + application-specific object. If the element is created from an XML file the + attribute will contain any text found after the element's end tag and before + the next tag. -.. attribute:: Element.tail + .. attribute:: attrib - The *tail* attribute can be used to hold additional data associated with the - element. This attribute is usually a string but may be any application-specific - object. If the element is created from an XML file the attribute will contain - any text found after the element's end tag and before the next tag. + A dictionary containing the element's attributes. Note that while the + *attrib* value is always a real mutable Python dictionary, an ElementTree + implementation may choose to use another internal representation, and create + the dictionary only if someone asks for it. To take advantage of such + implementations, use the dictionary methods below whenever possible. + The following dictionary-like methods work on the element attributes. -.. attribute:: Element.attrib - A dictionary containing the element's attributes. Note that while the *attrib* - value is always a real mutable Python dictionary, an ElementTree implementation - may choose to use another internal representation, and create the dictionary - only if someone asks for it. To take advantage of such implementations, use the - dictionary methods below whenever possible. + .. method:: clear() -The following dictionary-like methods work on the element attributes. + Resets an element. This function removes all subelements, clears all + attributes, and sets the text and tail attributes to None. -.. method:: Element.clear() + .. method:: get(key[, default]) - Resets an element. This function removes all subelements, clears all - attributes, and sets the text and tail attributes to None. + Gets the element attribute named *key*. + Returns the attribute value, or *default* if the attribute was not found. -.. method:: Element.get(key[, default=None]) - Gets the element attribute named *key*. + .. method:: items() - Returns the attribute value, or *default* if the attribute was not found. + Returns the element attributes as a sequence of (name, value) pairs. The + attributes are returned in an arbitrary order. -.. method:: Element.items() + .. method:: keys() - Returns the element attributes as a sequence of (name, value) pairs. The - attributes are returned in an arbitrary order. + Returns the elements attribute names as a list. The names are returned in an + arbitrary order. -.. method:: Element.keys() + .. method:: set(key, value) - Returns the elements attribute names as a list. The names are returned in an - arbitrary order. + Set the attribute *key* on the element to *value*. + The following methods work on the element's children (subelements). -.. method:: Element.set(key, value) - Set the attribute *key* on the element to *value*. + .. method:: append(subelement) -The following methods work on the element's children (subelements). + Adds the element *subelement* to the end of this elements internal list of + subelements. -.. method:: Element.append(subelement) + .. method:: extend(subelements) - Adds the element *subelement* to the end of this elements internal list of - subelements. + Appends *subelements* from a sequence object with zero or more elements. + Raises :exc:`AssertionError` if a subelement is not a valid object. + .. versionadded:: 2.7 -.. method:: Element.find(match) - Finds the first subelement matching *match*. *match* may be a tag name or path. - Returns an element instance or ``None``. + .. method:: find(match) + Finds the first subelement matching *match*. *match* may be a tag name or path. + Returns an element instance or ``None``. -.. method:: Element.findall(match) - Finds all subelements matching *match*. *match* may be a tag name or path. - Returns an iterable yielding all matching elements in document order. + .. method:: findall(match) + Finds all subelements matching *match*. *match* may be a tag name or path. + Returns an iterable yielding all matching elements in document order. -.. method:: Element.findtext(condition[, default=None]) - Finds text for the first subelement matching *condition*. *condition* may be a - tag name or path. Returns the text content of the first matching element, or - *default* if no element was found. Note that if the matching element has no - text content an empty string is returned. + .. method:: findtext(condition[, default]) + Finds text for the first subelement matching *condition*. *condition* may be + a tag name or path. Returns the text content of the first matching element, + or *default* if no element was found. Note that if the matching element has + no text content an empty string is returned. -.. method:: Element.getchildren() - Returns all subelements. The elements are returned in document order. + .. method:: getchildren() + .. deprecated:: 2.7 + Use ``list(elem)`` or iteration. -.. method:: Element.getiterator([tag=None]) - Creates a tree iterator with the current element as the root. The iterator - iterates over this element and all elements below it, in document (depth first) - order. If *tag* is not ``None`` or ``'*'``, only elements whose tag equals - *tag* are returned from the iterator. + .. method:: getiterator([tag]) + + .. deprecated:: 2.7 + Use method :meth:`Element.iter` instead. + + .. method:: insert(index, element) -.. method:: Element.insert(index, element) + Inserts a subelement at the given position in this element. - Inserts a subelement at the given position in this element. + .. method:: iter([tag]) -.. method:: Element.makeelement(tag, attrib) + Creates a tree iterator with the current element as the root. The iterator + iterates over this element and all elements below it, in document (depth + first) order. If *tag* is not ``None`` or ``'*'``, only elements whose tag + equals *tag* are returned from the iterator. If the tree structure is + modified during iteration, the result is undefined. - Creates a new element object of the same type as this element. Do not call this - method, use the SubElement factory function instead. + .. method:: makeelement(tag, attrib) -.. method:: Element.remove(subelement) + Creates a new element object of the same type as this element. Do not call + this method, use the SubElement factory function instead. - Removes *subelement* from the element. Unlike the findXYZ methods this method - compares elements based on the instance identity, not on tag value or contents. -Element objects also support the following sequence type methods for working -with subelements: :meth:`__delitem__`, :meth:`__getitem__`, :meth:`__setitem__`, -:meth:`__len__`. + .. method:: remove(subelement) -Caution: Because Element objects do not define a :meth:`__nonzero__` method, -elements with no subelements will test as ``False``. :: + Removes *subelement* from the element. Unlike the findXYZ methods this + method compares elements based on the instance identity, not on tag value + or contents. - element = root.find('foo') + Element objects also support the following sequence type methods for working + with subelements: :meth:`__delitem__`, :meth:`__getitem__`, :meth:`__setitem__`, + :meth:`__len__`. - if not element: # careful! - print "element not found, or element has no subelements" + Caution: Because Element objects do not define a :meth:`__nonzero__` method, + elements with no subelements will test as ``False``. :: - if element is None: - print "element not found" + element = root.find('foo') + + if not element: # careful! + print "element not found, or element has no subelements" + + if element is None: + print "element not found" .. _elementtree-elementtree-objects: @@ -348,9 +397,8 @@ .. method:: getiterator([tag]) - Creates and returns a tree iterator for the root element. The iterator - loops over all elements in this tree, in section order. *tag* is the tag - to look for (default is to return all elements) + .. deprecated:: 2.7 + Use method :meth:`ElementTree.iter` instead. .. method:: getroot() @@ -358,19 +406,28 @@ Returns the root element for this tree. + .. method:: iter([tag]) + + Creates and returns a tree iterator for the root element. The iterator + loops over all elements in this tree, in section order. *tag* is the tag + to look for (default is to return all elements) + + .. method:: parse(source[, parser]) Loads an external XML section into this element tree. *source* is a file name or file object. *parser* is an optional parser instance. If not - given, the standard XMLTreeBuilder parser is used. Returns the section + given, the standard XMLParser parser is used. Returns the section root element. - .. method:: write(file[, encoding]) + .. method:: write(file[, encoding[, xml_declaration]]) Writes the element tree to a file, as XML. *file* is a file name, or a file object opened for writing. *encoding* [1]_ is the output encoding - (default is US-ASCII). + (default is US-ASCII). *xml_declaration* controls if an XML declaration + should be added to the file. Use False for never, True for always, None + for only if not US-ASCII or UTF-8. None is default. This is the XML file that is going to be manipulated:: @@ -389,13 +446,13 @@ >>> from xml.etree.ElementTree import ElementTree >>> tree = ElementTree() >>> tree.parse("index.xhtml") - + >>> p = tree.find("body/p") # Finds first occurrence of tag p in body >>> p - - >>> links = p.getiterator("a") # Returns list of all links + + >>> links = list(p.iter("a")) # Returns list of all links >>> links - [, ] + [, ] >>> for i in links: # Iterates through all found links ... i.attrib["target"] = "blank" >>> tree.write("output.xhtml") @@ -433,7 +490,7 @@ .. method:: close() - Flushes the parser buffers, and returns the toplevel document + Flushes the builder buffers, and returns the toplevel document element. Returns an Element instance. @@ -455,18 +512,19 @@ containing element attributes. Returns the opened element. -.. _elementtree-xmltreebuilder-objects: +.. _elementtree-xmlparser-objects: -XMLTreeBuilder Objects +XMLParser Objects ---------------------- -.. class:: XMLTreeBuilder([html,] [target]) +.. class:: XMLParser([html [, target[, encoding]]]) Element structure builder for XML source data, based on the expat parser. *html* are predefined HTML entities. This flag is not supported by the current implementation. *target* is the target object. If omitted, the builder uses an - instance of the standard TreeBuilder class. + instance of the standard TreeBuilder class. *encoding* [1]_ is optional. + If given, the value overrides the encoding specified in the XML file. .. method:: close() @@ -474,24 +532,18 @@ Finishes feeding data to the parser. Returns an element structure. - .. method:: doctype(name, pubid, system) - - Handles a doctype declaration. *name* is the doctype name. *pubid* is the - public identifier. *system* is the system identifier. - - .. method:: feed(data) Feeds data to the parser. *data* is encoded data. -:meth:`XMLTreeBuilder.feed` calls *target*\'s :meth:`start` method +:meth:`XMLParser.feed` calls *target*\'s :meth:`start` method for each opening tag, its :meth:`end` method for each closing tag, -and data is processed by method :meth:`data`. :meth:`XMLTreeBuilder.close` +and data is processed by method :meth:`data`. :meth:`XMLParser.close` calls *target*\'s method :meth:`close`. -:class:`XMLTreeBuilder` can be used not only for building a tree structure. +:class:`XMLParser` can be used not only for building a tree structure. This is an example of counting the maximum depth of an XML file:: - >>> from xml.etree.ElementTree import XMLTreeBuilder + >>> from xml.etree.ElementTree import XMLParser >>> class MaxDepth: # The target object of the parser ... maxDepth = 0 ... depth = 0 @@ -507,7 +559,7 @@ ... return self.maxDepth ... >>> target = MaxDepth() - >>> parser = XMLTreeBuilder(target=target) + >>> parser = XMLParser(target=target) >>> exampleXml = """ ... ... @@ -530,4 +582,3 @@ appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not. See http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and http://www.iana.org/assignments/character-sets. -