我正在尝试使用 lxml.etree 从 JSON 对象创建 xml 树。有些标记名中包含冒号,例如:-
“设置:当前”我尝试使用
'{settings}current' 作为标签名称,但我得到这个:-
ns0:当前 xmlns:ns0 =“设置”
是的,首先阅读并理解 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>'
请注意,您必须有一个元素nsmap=MY_NAMESPACES
在您的 XML 树层次结构中。然后所有后代节点都可以使用该声明。在你的情况下,你没有那一点,所以 lxml 生成命名空间名称,例如ns0
另外,当您创建新节点时,请使用命名空间 URI 作为标记名称,而不是命名空间名称:{http://example.com/url-for-settings-namespace}current
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)