我正在使用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格式?
答案 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>