假设我要使用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
。我知道使用here的ET.register_namespace()
。
ET.register_namespace()
的问题在于:
prefix
和URI
例如如果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
解决此问题?
答案 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()
方法之前调用。