在Python中使用ElementTree解析具有名称空间的XML
我有一个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 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代码?我已经阅读并尝试了此命名空间注册,但没有帮助。我已经阅读并尝试了此命名空间注册,但没有帮助。