lxml标签名称带":"

时间:2011-12-08 14:57:04

标签: lxml colon tagname

我正在尝试使用lxml.etree从JSON对象创建一个xml树。一些标记名在其中继续冒号: -

'设置:当前'我尝试使用

'{settings} current'作为标记名称,但我得到了: -

ns0:当前xmlns:ns0 =“设置”

1 个答案:

答案 0 :(得分:8)

是的,首先阅读并理解XML命名空间。然后使用它来生成带有名称空间的XML树:u

>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace'}
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'], nsmap=MY_NAMESPACES)
>>> etree.tostring(e)
'<settings:current xmlns:settings="http://example.com/url-for-settings-namespace"/>'

您可以将其与默认命名空间

结合使用
>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace', None:    'http://example.com/url-for-default-namespace'}
>>> r=etree.Element('my-root', nsmap=MY_NAMESPACES)
>>> d=etree.Element('{%s}some-element' % MY_NAMESPACES[None])
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'])
>>> d.append(e)
>>> r.append(d)
>>> etree.tostring(r)
'<my-root xmlns:settings="http://example.com/url-for-settings-namespace" xmlns="http://example.com/url-for-default-namespace"><some-element><settings:current/></some-element></my-root>'

请注意,您必须在XML树层次结构中包含nsmap=MY_NAMESPACES的元素。然后所有后代节点都可以使用该声明。在你的情况下,你没有这一点,所以lxml生成名称空间名称,如ns0

此外,当您为标记名称创建新节点时使用名称空间URI,而不是名称空间名称:{http://example.com/url-for-settings-namespace}current