我用谷歌搜索我的裤子无济于事。我想要做的非常简单:我想使用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。我不确定如何针对命名空间使用find
,findall
或findtext
方法。
完全赞赏任何帮助。
答案 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