繁体   English   中英

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

[英]Using ElementTree to parse an XML string with a namespace

我用谷歌搜索我的裤子无济于事。 我想要做的非常简单:我想使用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方法。

任何帮助都完全赞赏。

以下内容应该让你前进:

>>> 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'

或者,您可以通过指定其完整路径直接找到一些精确元素:

>>> 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的网站可能包含有用的信息; 你想检查如何处理前缀 :实际上可能有一种更简单的方法来处理它们,而不是通过在上面的方法中明确NS路径。

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

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

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

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

我不假装必须在re的帮助下分析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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM