Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用ElementTree解析具有命名空间的XML字符串_Python_Xml_Elementtree - Fatal编程技术网

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

Python 使用ElementTree解析具有命名空间的XML字符串,python,xml,elementtree,Python,Xml,Elementtree,我用谷歌搜索了一下我的裤子,结果一无所获。我尝试做的很简单:我想使用ElementTree访问字符串中包含的以下XML中的UniqueID值 from xml.etree.ElementTree import fromstring xml_string = """<ListObjectsResponse xmlns='http://www.example.com/dir/'> <Item> <UniqueID>

我用谷歌搜索了一下我的裤子,结果一无所获。我尝试做的很简单:我想使用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)
from xml.etree.ElementTree导入fromstring
xml_string=“”
abcdefghijklmnopqrstuvwxyz0123456789
"""
NS=”http://www.example.com/dir/"
tree=fromstring(xml\u字符串)
我知道我应该使用
fromstring
方法来解析XML字符串,但我似乎无法确定如何访问UniqueID。我不确定如何对命名空间使用
find
findall
findtext
方法


非常感谢您的帮助。

以下几点可以帮助您:

>>> tree.findall('*/*')
[<Element '{http://www.example.com/dir/}UniqueID' at 0x10899e450>]
或者,您可以通过指定某个精确的元素来直接查找该元素:

>>tree.find({{{0}}}项/{{{0}}}UniqueID.format(NS))#标记的前缀是NS

正如Tomalak指出的,可能包含有用的信息;您想检查如何处理前缀:事实上,处理前缀的方法可能比在上面的方法中显式显示
NS
路径更简单。

我知道,作为报复,我的答案会有一些恐惧和反对票,因为我使用modulere来分析XML字符串,但请注意:

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

  • 我希望下层选民能举出一些案例,说明我的解决方案存在问题

  • 我不解析字符串,取“parse”这个词的意思是“在分析树之前获取一棵树以找到搜索的内容”;我分析它:我直接找到文本的whished部分

我并不认为XML字符串必须始终在re的帮助下进行分析。在大多数情况下,可能必须使用专用解析器解析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)
重新导入
xml_string=“”
abcdefghijklmnopqrstuvwxyz0123456789
"""
打印xml_字符串
打印“\n==========================================================\n”
打印搜索(“(.+?)”,xml_字符串,re.DOTALL).group(1)
结果

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

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

abcdefghijklmnopqrstuvwxyz0123456789

abcdefghijklmnopqrstuvwxyz0123456789
=================================
abcdefghijklmnopqrstuvwxyz0123456789

你用谷歌搜索了你的裤子?搜索“ElementTree find namespace”的第二个结果是:我阅读了整个内容。恐怕我还是不太理解它来帮助解决我的困境。@Raj我也很少完全理解effobot网站上的解释谢谢你的例子。在这种情况下,如何打印实际的UniqueID?@Raj:我添加了显示如何获取UniqueID元素内容的代码。+1:这种方法在某些情况下确实非常好。Is还具有非常清晰的优点(搜索文本的格式非常明显)。
import reeeeee
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