在Python中通过ElementTree解析xml时如何保留名称空间

时间:2019-01-30 11:15:01

标签: python xml xml-parsing xml-namespaces elementtree

假设我要使用Python的ElementTree修改以下XML:

<root xmlns:prefix="URI">
  <child company:name="***"/>
  ...
</root> 

我正在这样修改XML文件:

import xml.etree.ElementTree as ET
tree = ET.parse('filename.xml')
# XML modification here
# save the modifications
tree.write('filename.xml')

然后XML文件如下所示:

<root xmlns:ns0="URI">
  <child ns0:name="***"/>
  ...
</root>

如您所见,名称空间prefix更改为ns0。我知道使用hereET.register_namespace()

ET.register_namespace()的问题在于:

  1. 您需要了解prefixURI
  2. 不能与默认名称空间一起使用。

例如如果xml看起来像这样:

<root xmlns="http://uri">
    <child name="name">
    ...
    </child>
</root>

它将被转换为类似的内容

<ns0:root xmlns:ns0="http://uri">
    <ns0:child name="name">
    ...
    </ns0:child>
</ns0:root>

如您所见,默认名称空间已更改为ns0

有什么办法可以用ElementTree解决此问题?

1 个答案:

答案 0 :(得分:1)

下面是保留的命名空间前缀和方式URI:

def register_all_namespaces(filename):
    namespaces = dict([node for _, node in ET.iterparse(filename, events=['start-ns'])])
    for ns in namespaces:
        ET.register_namespace(ns, namespaces[ns])

此方法应被调用[ET].write()方法之前调用。