[Python-checkins] cpython (2.7): Issue 23729: Document ElementTree namespace handling and fix an omission in

raymond.hettinger python-checkins at python.org
Sun Mar 22 23:31:36 CET 2015


https://hg.python.org/cpython/rev/000814bbc899
changeset:   95137:000814bbc899
branch:      2.7
parent:      95132:a56aa567072c
user:        Raymond Hettinger <python at rcn.com>
date:        Sun Mar 22 15:31:28 2015 -0700
summary:
  Issue 23729:  Document ElementTree namespace handling and fix an omission in the XPATH predicate table.

files:
  Doc/library/xml.etree.elementtree.rst |  68 +++++++++++++++
  1 files changed, 68 insertions(+), 0 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
@@ -266,6 +266,71 @@
    >>> ET.dump(a)
    <a><b /><c><d /></c></a>
 
+Parsing XML with Namespaces
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If the XML input has `namespaces
+<https://en.wikipedia.org/wiki/XML_namespace>`__, tags and attributes
+with prefixes in the form ``prefix:sometag`` get expanded to
+``{uri}tag`` where the *prefix* is replaced by the full *URI*.  Also,
+if there is a `default namespace
+<http://www.w3.org/TR/2006/REC-xml-names-20060816/#defaulting>`__,
+that full URI gets prepended to all of the non-prefixed tags.
+
+Here is an XML example that incorporates two namespaces, one with the
+prefix "fictional" and the other serving as the default namespace:
+
+.. code-block:: xml
+
+    <?xml version="1.0"?>
+    <actors xmlns:fictional="http://characters.example.com"
+            xmlns="http://people.example.com">
+        <actor>
+            <name>John Cleese</name>
+            <fictional:character>Lancelot</fictional:character>
+            <fictional:character>Archie Leach</fictional:character>
+        </actor>
+        <actor>
+            <name>Eric Idle</name>
+            <fictional:character>Sir Robin</fictional:character>
+            <fictional:character>Gunther</fictional:character>
+            <fictional:character>Commander Clement</fictional:character>
+        </actor>
+    </actors>
+
+One way to search and explore this XML example is to manually add the
+URI to every tag or attribute in the xpath of a *find()* or *findall()*::
+
+    root = from_string(xml_text)
+    for actor in root.findall('{http://people.example.com}actor'):
+        name = actor.find('{http://people.example.com}name')
+        print name.text
+        for char in actor.findall('{http://characters.example.com}character'):
+            print ' |-->', char.text
+
+Another way to search the namespaced XML example is to create a
+dictionary with your own prefixes and use those in the search::
+
+    ns = {'real_person': 'http://people.example.com',
+          'role': 'http://characters.example.com'}
+
+    for actor in root.findall('real_person:actor', ns):
+        name = actor.find('real_person:name', ns)
+        print name.text
+        for char in actor.findall('role:character', ns):
+            print ' |-->', char.text
+
+These two approaches both output::
+
+    John Cleese
+     |--> Lancelot
+     |--> Archie Leach
+    Eric Idle
+     |--> Sir Robin
+     |--> Gunther
+     |--> Commander Clement
+
+
 Additional resources
 ^^^^^^^^^^^^^^^^^^^^
 
@@ -345,6 +410,9 @@
 | ``[tag]``             | Selects all elements that have a child named         |
 |                       | ``tag``.  Only immediate children are supported.     |
 +-----------------------+------------------------------------------------------+
+| ``[tag=text]``        | Selects all elements that have a child named         |
+|                       | ``tag`` that includes the given ``text``.            |
++-----------------------+------------------------------------------------------+
 | ``[position]``        | Selects all elements that are located at the given   |
 |                       | position.  The position can be either an integer     |
 |                       | (1 is the first position), the expression ``last()`` |

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


More information about the Python-checkins mailing list