【发布时间】:2017-11-09 17:45:23
【问题描述】:
如何使用相同的命名空间将某个元素替换为字符串sn-p?
<!-- language: python -->
from lxml import etree
replacestring = '''<AP_PTO gml:id="DEAL123456789abc">
<new>This Element is new!</new>
</AP_PTO>'''
file = etree.parse("nasfile.xml")
root = file.getroot()
nsmap = root.nsmap.copy()
nsmap['adv'] = nsmap.pop(None)
nodes = root.xpath(".//adv:geaenderteObjekte/wfs:Transaction", namespaces=nsmap)
# Iterate object elements
for t in nodes[0]:
for obj in t:
oart = str(etree.QName(objekt.tag).localname)
if oart == 'Filter':
pass
else:
objid = (obj.xpath('@gml:id', namespaces=nsmap))[0][:16]
if objid == 'DEAL123456789abc':
t.replace(obj, etree.fromstring(replacestring))
#nodes[0].remove(t)
我从输入文件中获取命名空间作为 nsmap:
{'adv': 'http://www.adv-online.de/namespaces/adv/gid/6.0',
'asdkom': 'http://www.lverma.nrw.de/namespaces/kom-ok/1.1',
'fc': 'http://www.adv-online.de/namespaces/adv/gid/fc/6.0',
'gco': 'http://www.isotc211.org/2005/gco',
'gmd': 'http://www.isotc211.org/2005/gmd',
'gml': 'http://www.opengis.net/gml/3.2',
'gsr': 'http://www.isotc211.org/2005/gsr',
'gss': 'http://www.isotc211.org/2005/gss',
'gts': 'http://www.isotc211.org/2005/gts',
'ogc': 'http://www.adv-online.de/namespaces/adv/gid/ogc',
'wfs': 'http://www.adv-online.de/namespaces/adv/gid/wfs',
'wfsext': 'http://www.adv-online.de/namespaces/adv/gid/wfsext',
'xlink': 'http://www.w3.org/1999/xlink',
'xs': 'http://www.w3.org/2001/XMLSchema',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
如果我从替换字符串中删除 gml: Prefix,则循环按预期工作。该字符串用给定的 ID 替换前一个元素。但是有了前缀,我得到了一个: XMLSyntaxError:AP_PTO 上 id 的命名空间前缀 gml 未定义,第 2 行,第 34 列
如何告诉 lxml 从源文件中使用 nsmap 中定义的命名空间?
【问题讨论】: