Python XML命名空间元素文本

时间:2013-06-04 13:36:05

标签: python xml lxml xml-namespaces

我想使用Python的ElementTree API(和lxml)编写一个简单的SOAP响应。编写SOAP响应涉及使用命名空间编写元素文本(值)。 For an example, click here.

使用命名空间编写元素并不是一个大问题,但是某些元素包含具有命名空间的文本。

我想创建类似的东西:

<pleh:a xmlns:pleh="http://pleh">pleh:x</pleh:a>

所以'自然'我做:

try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree

pleh = 'http://pleh'
etree.register_namespace('pleh', pleh)
a = etree.Element('{%s}a' % pleh)
a.text = '{%s}x' % pleh
print(etree.tostring(a))

但这会打印<pleh:a xmlns:pleh="http://pleh">{http://pleh}x</pleh:a>

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

没有“命名空间元素文本”或“具有命名空间的文本”之类的东西。您的元素作为一个整体绑定到命名空间,这是真的。但是元素文本内容,例如pleh:x只是一个普通的字符串。 pleh位恰好是与元素命名空间关联的(任意)前缀,但就XML命名空间而言,它并不重要。


在这里,您可以在http://pleh命名空间中创建一个XML元素:

a = etree.Element('{%s}a' % pleh)

花括号被解释为命名空间URI的分隔符。这称为"Clark notation"。大括号不会出现在序列化的XML中。

在这里创建一个字符串:

a.text = '{%s}x' % pleh

元素的文本内容变为{http://pleh}x。这不是你所期望的,但它完全符合逻辑(它不是lxml中的错误)。

如果您需要文字内容为pleh:x,请使用a.text = 'pleh:x'