在Python中使用ElementTree解析具有名称空间的XML

在Python中使用ElementTree解析具有名称空间的XML,python,xml,python-2.7,xml-parsing,elementtree,Python,Xml,Python 2.7,Xml Parsing,Elementtree,我有一个xml,它的一小部分如下所示: <?xml version="1.0" ?> <i:insert xmlns:i="urn:com:xml:insert" xmlns="urn:com:xml:data"> <data> <image imageId="1"></image> <content>Content</content> </data> </i:inser

我有一个xml,它的一小部分如下所示:

<?xml version="1.0" ?>
<i:insert xmlns:i="urn:com:xml:insert" xmlns="urn:com:xml:data">
  <data>
    <image imageId="1"></image>
    <content>Content</content>
  </data>
</i:insert>
为什么它会改变前缀并把它们放在任何地方?使用minidom我没有这样的问题。是否已配置?ElementTree的文档非常差。 问题是,在这样的解析之后,我找不到任何节点,例如image,如果我像{namespace}image或just image那样使用它,那么无论是否使用名称空间,我都找不到它。为什么?如有任何建议,我们将不胜感激

我已经尝试过的:

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
for a in root.findall('ns1:image'):
    print a.attrib
这将返回一个错误,而另一个则不返回任何内容:

for a in root.findall('{urn:com:xml:data}image'):
    print a.attrib
我还尝试将名称空间设置为这样并使用它:

namespaces = {'ns1': 'urn:com:xml:data'}
for a in root.findall('ns1:image', namespaces):
    print a.attrib

它什么也不返回。我做错了什么?

据我所知,这与ET中的名称空间识别有关

从这里

将元素树保存为XML时,标准元素序列化程序会为树中出现的所有URI生成唯一的前缀。前缀的形式通常为“ns”,后跟一个数字。例如,上面的元素可以用前缀ns0表示“”和ns1表示“”进行序列化

如果要使用特定前缀,可以将前缀/uri映射添加到ElementTree模块中的全局表中。在1.3及更高版本中,可以通过调用register_名称空间函数来实现这一点。在早期版本中,您可以直接访问内部表:

元素树1.3 ET.register\u名称空间前缀,uri

ElementTree 1.2 Python 2.5 ET._名称空间_映射[uri]=前缀


注意参数顺序;函数首先获取前缀,而原始字典从URI:s映射到前缀。

据我收集,它与ET中的名称空间识别有关

从这里

将元素树保存为XML时,标准元素序列化程序会为树中出现的所有URI生成唯一的前缀。前缀的形式通常为“ns”,后跟一个数字。例如,上面的元素可以用前缀ns0表示“”和ns1表示“”进行序列化

如果要使用特定前缀,可以将前缀/uri映射添加到ElementTree模块中的全局表中。在1.3及更高版本中,可以通过调用register_名称空间函数来实现这一点。在早期版本中,您可以直接访问内部表:

元素树1.3 ET.register\u名称空间前缀,uri

ElementTree 1.2 Python 2.5 ET._名称空间_映射[uri]=前缀


注意参数顺序;函数首先获取前缀,而原始字典从URI:s映射到前缀。

这是您问题的片段

for a in root.findall('{urn:com:xml:data}image'):
    print a.attrib
不输出任何内容,因为它只查找树根的直接{urn:com:xml:data}映像子级

这个稍加修改的代码

for a in root.findall('.//{urn:com:xml:data}image'):
    print a.attrib
将打印{'imageId':'1'},因为它使用。//,它在所有级别上选择匹配的子元素

参考文献:


ElementTree在默认情况下不仅保留了原始的名称空间前缀,而且要记住,重要的不是前缀。register_namespace函数可用于在序列化XML时设置所需的前缀。该函数对解析或搜索没有任何影响。

此问题的片段

for a in root.findall('{urn:com:xml:data}image'):
    print a.attrib
不输出任何内容,因为它只查找树根的直接{urn:com:xml:data}映像子级

这个稍加修改的代码

for a in root.findall('.//{urn:com:xml:data}image'):
    print a.attrib
将打印{'imageId':'1'},因为它使用。//,它在所有级别上选择匹配的子元素

参考文献:


ElementTree在默认情况下不仅保留了原始的名称空间前缀,而且要记住,重要的不是前缀。register_namespace函数可用于在序列化XML时设置所需的前缀。该函数对解析或搜索没有任何影响。

是否可以添加用于解析XML的Python代码?是否可以添加用于解析XML的Python代码?我已经阅读并尝试了此命名空间注册,但没有帮助。我已经阅读并尝试了此命名空间注册,但没有帮助。