[Python-checkins] cpython: Issue #15586: add some examples to ElementTree documentation. Patch by Daniel

eli.bendersky python-checkins at python.org
Tue Aug 14 06:21:03 CEST 2012


http://hg.python.org/cpython/rev/fc66730dae4c
changeset:   78556:fc66730dae4c
parent:      78553:70f7559e6d0f
user:        Eli Bendersky <eliben at gmail.com>
date:        Tue Aug 14 07:19:33 2012 +0300
summary:
  Issue #15586: add some examples to ElementTree documentation. Patch by Daniel Ellis.

files:
  Doc/library/xml.etree.elementtree.rst |  111 ++++++++++++-
  1 files changed, 100 insertions(+), 11 deletions(-)


diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -35,10 +35,11 @@
 Parsing XML
 ^^^^^^^^^^^
 
-We'll be using the following XML document contained in a Python string as the
-sample data for this section::
+We'll be using the following XML document as the sample data for this section:
 
-   countrydata = r'''<?xml version="1.0"?>
+.. code-block:: xml
+
+   <?xml version="1.0"?>
    <data>
        <country name="Liechtenshtein">
            <rank>1</rank>
@@ -61,18 +62,20 @@
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
-   '''
 
-First, import the module and parse the data::
+We can import this data by reading from a file::
 
    import xml.etree.ElementTree as ET
+   tree = ET.parse('country_data.xml')
+   root = tree.getroot()
 
-   root = ET.fromstring(countrydata)
+Or directly from a string::
+
+   root = ET.fromstring(country_data_as_string)
 
 :func:`fromstring` parses XML from a string directly into an :class:`Element`,
 which is the root element of the parsed tree.  Other parsing functions may
-create an :class:`ElementTree`.  Make sure to check the documentation to be
-sure.
+create an :class:`ElementTree`.  Check the documentation to be sure.
 
 As an :class:`Element`, ``root`` has a tag and a dictionary of attributes::
 
@@ -111,13 +114,27 @@
    {'name': 'Costa Rica', 'direction': 'W'}
    {'name': 'Colombia', 'direction': 'E'}
 
+:meth:`Element.findall` finds only elements with a tag which are direct
+children of the current element.  :meth:`Element.find` finds the *first* child
+with a particular tag, and :meth:`Element.text` accesses the element's text
+content.  :meth:`Element.get` accesses the element's attributes::
+
+   >>> for country in root.findall('country'):
+   ...   rank = country.find('rank').text
+   ...   name = country.get('name')
+   ...   print(name, rank)
+   ...
+   Liechtenshtein 1
+   Singapore 4
+   Panama 68
+
 More sophisticated specification of which elements to look for is possible by
 using :ref:`XPath <elementtree-xpath>`.
 
-Building XML documents
-^^^^^^^^^^^^^^^^^^^^^^
+Modifying an XML File
+^^^^^^^^^^^^^^^^^^^^^
 
-``ET`` provides a simple way to build XML documents and write them to files.
+:class:`ElementTree` provides a simple way to build XML documents and write them to files.
 The :meth:`ElementTree.write` method serves this purpose.
 
 Once created, an :class:`Element` object may be manipulated by directly changing
@@ -125,6 +142,78 @@
 (:meth:`Element.set` method), as well as adding new children (for example
 with :meth:`Element.append`).
 
+Let's say we want to add one to each country's rank, and add an ``updated``
+attribute to the rank element::
+
+   >>> for rank in root.iter('rank'):
+   ...   new_rank = int(rank.text) + 1
+   ...   rank.text = str(new_rank)
+   ...   rank.set('updated', 'yes')
+   ...
+   ... tree.write('output.xml')
+
+Our XML now looks like this:
+
+.. code-block:: xml
+
+   <?xml version="1.0"?>
+   <data>
+       <country name="Liechtenshtein">
+           <rank updated="yes">2</rank>
+           <year>2008</year>
+           <gdppc>141100</gdppc>
+           <neighbor name="Austria" direction="E"/>
+           <neighbor name="Switzerland" direction="W"/>
+       </country>
+       <country name="Singapore">
+           <rank updated="yes">5</rank>
+           <year>2011</year>
+           <gdppc>59900</gdppc>
+           <neighbor name="Malaysia" direction="N"/>
+       </country>
+       <country name="Panama">
+           <rank updated="yes">69</rank>
+           <year>2011</year>
+           <gdppc>13600</gdppc>
+           <neighbor name="Costa Rica" direction="W"/>
+           <neighbor name="Colombia" direction="E"/>
+       </country>
+   </data>
+
+We can remove elements using :meth:`Element.remove`.  Let's say we want to
+remove all countries with a rank higher than 50::
+
+   >>> for country in root.findall('country'):
+   ...   rank = int(country.find('rank').text)
+   ...   if rank > 50:
+   ...     root.remove(country)
+   ...
+   ... tree.write('output.xml')
+
+Our XML now looks like this:
+
+.. code-block:: xml
+
+   <?xml version="1.0"?>
+   <data>
+       <country name="Liechtenshtein">
+           <rank updated="yes">2</rank>
+           <year>2008</year>
+           <gdppc>141100</gdppc>
+           <neighbor name="Austria" direction="E"/>
+           <neighbor name="Switzerland" direction="W"/>
+       </country>
+       <country name="Singapore">
+           <rank updated="yes">5</rank>
+           <year>2011</year>
+           <gdppc>59900</gdppc>
+           <neighbor name="Malaysia" direction="N"/>
+       </country>
+   </data>
+
+Building XML documents
+^^^^^^^^^^^^^^^^^^^^^^
+
 The :func:`SubElement` function also provides a convenient way to create new
 sub-elements for a given element::
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list