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

Ami*_*deh 1 python xml elementtree xml-namespaces xml-parsing

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

<root xmlns:prefix="URI">
  <child company:name="***"/>
  ...
</root> 
Run Code Online (Sandbox Code Playgroud)

我正在对XML文件进行如下修改:

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

然后,XML文件如下所示:

<root xmlns:ns0="URI">
  <child ns0:name="***"/>
  ...
</root>
Run Code Online (Sandbox Code Playgroud)

如您所见,namepsace prefix更改为ns0。我知道这里ET.register_namespace()提到的使用。

问题ET.register_namespace()在于:

  1. 你需要知道prefixURI
  2. 不能与默认名称空间一起使用。

例如,如果xml看起来像:

<root xmlns="http://uri">
    <child name="name">
    ...
    </child>
</root>
Run Code Online (Sandbox Code Playgroud)

它将转换为以下内容:

<ns0:root xmlns:ns0="http://uri">
    <ns0:child name="name">
    ...
    </ns0:child>
</ns0:root>
Run Code Online (Sandbox Code Playgroud)

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

有什么办法解决这个问题ElementTree吗?

Ami*_*deh 5

这是保留名称空间的前缀和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])
Run Code Online (Sandbox Code Playgroud)

在调用该[ET].write()方法之前,应先调用此方法。

  • 这个解决方案比我在同一主题的许多其他问题上看到的要好得多。感谢您分享。 (3认同)