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()在于:
prefix和URI例如,如果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吗?
这是保留名称空间的前缀和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()方法之前,应先调用此方法。