我有 XML:
<root xmlns="test:env:v.1"><elem1>text-1</elem1><elem2>text-2</elem2></root>
我需要使用 lxml 设置默认命名空间的前缀:
<n1:root xmlns:n1="test:env:v.1"><n1:elem1>text-1</n1:elem1><n1:elem2>text-2</n1:elem2></n1:root>
解决方案是这样的:创建一个新的xml(包装器),设置命名空间前缀,并将原始xml放入其中,前缀将被继承。如果您想保留原始XML,您可以申请
deepcopy
。
import copy
from lxml import etree
origin = etree.fromstring('<root xmlns="test:env:v.1"><elem1>text-1</elem1><elem2>text-2</elem2></root>')
ns = origin.nsmap[None]
wrapper = etree.Element(etree.QName(ns, 'wrap'), nsmap={'n1': ns})
copy_ = copy.deepcopy(origin)
wrapper.append(copy_)
print(etree.tostring(origin, method='c14n').decode('ascii'))
print(etree.tostring(copy_, method='c14n').decode('ascii'))
也许有更好的解决方案