我想使用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>
我在这里缺少什么?
答案 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'