1

我想使用 Python 的 ElementTree API(和 lxml)编写一个简单的 SOAP 响应。编写 SOAP 响应涉及使用名称空间编写元素文本(值)。例如,请单击此处。

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

我想创建类似的东西:

<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>

我在这里想念什么?

4

1 回答 1

0

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


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

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

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

在这里创建一个字符串:

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

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

如果您需要文本内容pleh:x,只需使用a.text = 'pleh:x'

于 2013-06-11T16:53:30.277 回答