使用LXML生成xml - 属性名称空间

时间:2016-10-22 20:23:53

标签: python lxml

我需要生成如下所示的xml:

<definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org">
  <typeRef xmlns:ns2="xyz">text</typeRef>
</definitions>

我的代码如下:

class XMLNamespaces:
    ex = 'http://www.example1.org' 
    xmlns = 'http://www.example2.org'

root = Element('definitions', xmlns='http://www.example2.org', nsmap = {'ex':XMLNamespaces.ex})
type_ref = SubElement(root, 'typeRef')
type_ref.attrib[QName(XMLNamespaces.xmlns, 'ns2')] = 'xyz'
type_ref.text = 'text'

tree = ElementTree(root)
tree.write('filename.xml', pretty_print=True)

结果如下:

<definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org">
  <typeRef xmlns:ns0="http://www.example2.org" ns0:ns2="xyz">text</typeRef>
</definitions>

所以这是我的问题:

如何使属性看起来像 xmlns:ns2 =&#34; xyz&#34; 而不是 xmlns:ns0 =&#34; http://www.example2.org& #34; NS0:NS2 =&#34; XYZ&#34;

1 个答案:

答案 0 :(得分:1)

只需使用 nsmap 参数定义命名空间字典的开始元素运行相同的过程。注意类对象中添加的变量:

from lxml.etree import *

class XMLNamespaces:
    ex = 'http://www.example1.org' 
    xmlns = 'http://www.example2.org'
    xyz = 'xyz'

root = Element('definitions', xmlns='http://www.example2.org', nsmap={'ex':XMLNamespaces.ex})
type_ref = SubElement(root, 'typeRef', nsmap={'ns2':XMLNamespaces.xyz})
type_ref.text = 'text'

tree = ElementTree(root)
tree.write('filename.xml', pretty_print=True)

# <definitions xmlns:ex="http://www.example1.org" xmlns="http://www.example2.org">
#   <typeRef xmlns:ns2="xyz">text</typeRef>
# </definitions>