Issue #23729: Improve docs for ElementTree namespace parsing

This commit is contained in:
Raymond Hettinger 2015-03-30 20:29:28 -07:00
parent e7f5e147cd
commit c43a666ba2
1 changed files with 10 additions and 8 deletions

View File

@ -290,8 +290,8 @@ Parsing XML with Namespaces
If the XML input has `namespaces If the XML input has `namespaces
<https://en.wikipedia.org/wiki/XML_namespace>`__, tags and attributes <https://en.wikipedia.org/wiki/XML_namespace>`__, tags and attributes
with prefixes in the form ``prefix:sometag`` get expanded to with prefixes in the form ``prefix:sometag`` get expanded to
``{uri}tag`` where the *prefix* is replaced by the full *URI*. Also, ``{uri}sometag`` where the *prefix* is replaced by the full *URI*.
if there is a `default namespace Also, if there is a `default namespace
<http://www.w3.org/TR/2006/REC-xml-names-20060816/#defaulting>`__, <http://www.w3.org/TR/2006/REC-xml-names-20060816/#defaulting>`__,
that full URI gets prepended to all of the non-prefixed tags. that full URI gets prepended to all of the non-prefixed tags.
@ -317,17 +317,18 @@ prefix "fictional" and the other serving as the default namespace:
</actors> </actors>
One way to search and explore this XML example is to manually add the 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()*:: URI to every tag or attribute in the xpath of a
:meth:`~Element.find` or :meth:`~Element.findall`::
root = from_string(xml_text) root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'): for actor in root.findall('{http://people.example.com}actor'):
name = actor.find('{http://people.example.com}name') name = actor.find('{http://people.example.com}name')
print(name.text) print(name.text)
for char in actor.findall('{http://characters.example.com}character'): for char in actor.findall('{http://characters.example.com}character'):
print(' |-->', char.text) print(' |-->', char.text)
Another way to search the namespaced XML example is to create a A better way to search the namespaced XML example is to create a
dictionary with your own prefixes and use those in the search:: dictionary with your own prefixes and use those in the search functions::
ns = {'real_person': 'http://people.example.com', ns = {'real_person': 'http://people.example.com',
'role': 'http://characters.example.com'} 'role': 'http://characters.example.com'}
@ -431,8 +432,9 @@ Supported XPath syntax
| ``[tag]`` | Selects all elements that have a child named | | ``[tag]`` | Selects all elements that have a child named |
| | ``tag``. Only immediate children are supported. | | | ``tag``. Only immediate children are supported. |
+-----------------------+------------------------------------------------------+ +-----------------------+------------------------------------------------------+
| ``[tag=text]`` | Selects all elements that have a child named | | ``[tag='text']`` | Selects all elements that have a child named |
| | ``tag`` that includes the given ``text``. | | | ``tag`` whose complete text content, including |
| | descendants, equals the given ``text``. |
+-----------------------+------------------------------------------------------+ +-----------------------+------------------------------------------------------+
| ``[position]`` | Selects all elements that are located at the given | | ``[position]`` | Selects all elements that are located at the given |
| | position. The position can be either an integer | | | position. The position can be either an integer |