使用Python lxml的SubElement命名内部标记

时间:2014-02-14 16:34:53

标签: python lxml

我正在使用Python和lxml库生成一个我希望如下的XML文件:

<item>
  <a:text>hello</a:text>
</item>

但是,我无法设法生成这个,我尝试了以下代码:

import lxml.etree as etree
item = etree.Element('item')
el = etree.SubElement(item, 'text', nsmap={'a': 'http://example.com/')

但后来我最终得到了:

<item>
  <text xmlns="http://example.com/">hello</text>
</item>

我在lxml命名空间文档(http://lxml.de/tutorial.html#namespaces)的一些灵感之后也试过这个:

import lxml.etree as etree
item = etree.Element('item')
el = etree.SubElement(item, '{a}text')

但这给了我:

<item>
  <ns1:text xmlns:ns1="a">hello</text>
</item>

有没有办法用lxml获取我需要的XML格式?

1 个答案:

答案 0 :(得分:0)

首先要注意的是......

<item>
  <a:text>hello</a:text>
</item>

...是无效的XML。 a:是名称空间前缀,但在某处您必须将其映射到实际名称空间,如:

<item xmlns:a="http://example.com/">
  <a:text>hello</a:text>
</item>

正如您在lxml文档中所读到的那样,您可以使用{namespace}element语法来指定命名空间......但这会使用实际的命名空间,而不是命名空间前缀(这就是为什么你的第二个例子没有按预期工作。)

你可以得到我想你想要的东西:

>>> from lxml import etree
>>> item = etree.Element('item', nsmap={'a': 'http://example.com/'})
>>> e1 = etree.SubElement(item, '{http://example.com/}text')

这给了你:

>>> print etree.tostring(item, pretty_print=True)
<item xmlns:a="http://example.com/">
  <a:text/>
</item>

值得注意的是,从XML的角度来看,上面的完全等同于:

<item>
  <text xmlns="http://example.com/">hello</text>
</item>