使用ElementTree解析带有命名空间的XML字符串

时间:2011-12-14 20:28:55

标签: python xml elementtree

我用谷歌搜索我的裤子无济于事。我想要做的非常简单:我想使用ElementTree访问字符串中包含的以下XML中的UniqueID值。

from xml.etree.ElementTree import fromstring

xml_string = """<ListObjectsResponse xmlns='http://www.example.com/dir/'>
        <Item>
                <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID>
        </Item>
</ListObjectsResponse>"""

NS = "http://www.example.com/dir/"

tree = fromstring(xml_string)

我知道我应该使用fromstring方法来解析XML字符串,但我似乎无法确定如何访问UniqueID。我不确定如何针对命名空间使用findfindallfindtext方法。

完全赞赏任何帮助。

2 个答案:

答案 0 :(得分:5)

以下内容可以帮助您:

>>> tree.findall('*/*')
[<Element '{http://www.example.com/dir/}UniqueID' at 0x10899e450>]

这将列出树的根下两层的所有元素(在您的情况下为UniqueID元素)。或者,您可以使用tree.find()在此级别仅查找第一个元素。然后,您可以直接获取UniqueID元素的文本内容:

>>> unique_id_elmt = tree.find('*/*')  # First (and only) element two levels below the root
>>> unique_id_elmt
<Element '{http://www.example.com/dir/}UniqueID' at 0x105ec9450>
>>> unique_id_elmt.text  # Text contained in UniqueID
'abcdefghijklmnopqrstuvwxyz0123456789'

或者,您可以通过指定full path

直接找到一些精确元素
>>> tree.find('{{{0}}}Item/{{{0}}}UniqueID'.format(NS))  # Tags are prefixed with NS
<Element '{http://www.example.com/dir/}UniqueID' at 0x10899ead0>

正如Tomalak所指出的,Fredrik Lundh's site可能包含有用的信息;你想检查如何处理前缀:实际上可能有一种更简单的方法来处理它们,而不是在上面的方法中明确NS路径。

答案 1 :(得分:3)

我知道我的答案会有一些恐怖和贬低的叫喊作为报复,因为我使用模块重新来分析XML字符串,但请注意:

  • 在大多数情况下,以下解决方案不会导致任何问题

  • 我希望知情人员举例说明导致我的解决方案出现问题的案例

  • 我不解析字符串,在“分析树以找到搜索内容之前获取树时”中使用“解析”一词;我分析一下:我直接找到了文本的小部分

我不假装必须始终在重新的帮助下分析XML字符串。在大多数情况下,可能必须使用专用解析器解析XML字符串。我只是说,在像这样的简单情况下,可以进行简单快速的分析,使用正则表达式工具更容易,顺便说一句,它更快。

import re

xml_string = """<ListObjectsResponse xmlns='http://www.example.com/dir/'>
        <Item>
                <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID>
        </Item>
</ListObjectsResponse>"""

print xml_string
print '\n=================================\n'

print re.search('<UniqueID>(.+?)</UniqueID>', xml_string, re.DOTALL).group(1)

结果

<ListObjectsResponse xmlns='http://www.example.com/dir/'>
        <Item>
                <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID>
        </Item>
</ListObjectsResponse>

=================================

abcdefghijklmnopqrstuvwxyz0123456789