以下是一个最小的工作示例。我用Python 3.4,Python 3.6 32位和Python 3.6 64位测试了它。
import io
from lxml import etree
test_node = etree.fromstring('''
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<soap:Body>
<ns1:RequestSecurityToken/>
</soap:Body>
</soap:Envelope>''')
output = io.BytesIO(b'<?xml version="1.0" encoding="UTF-8"?>')
test_node.getroottree().write(output,
encoding="UTF-8",
xml_declaration=None,
default_namespace=None,
method="c14n",
short_empty_elements=False
)
output.seek(0)
print(output.read())
结果:
Traceback (most recent call last):
File "C:/not_telling/c14n.py", line 16, in <module>
short_empty_elements=False
File "lxml.etree.pyx", line 1869, in lxml.etree._ElementTree.write (src\lxml\lxml.etree.c:57004)
TypeError: write() got an unexpected keyword argument 'short_empty_elements'
我刚刚将lxml版本升级到4.0.0。 (但同样是3.7的问题。)
我需要使用C14N方法导出,并且(虽然未包含在示例中)我还需要指定需要在生成的规范形式中显示的命名空间列表。例如。我也必须使用inclusive_ns_prefixes参数。
更新:实际上,它似乎是Python内置的xml模块的问题,而不是lxml。
这是我打电话的方法:
https://github.com/python/cpython/blob/master/Lib/xml/etree/ElementTree.py#L721
它有一个short_empty_elements参数,但它不接受它。
答案 0 :(得分:1)
lxml中的default_namespace
方法不支持short_empty_elements
和_ElementTree.write()
参数。请参阅http://lxml.de/api/lxml.etree._ElementTree-class.html#write。
但是,自Python 3.4以来,这两个参数都可以在ElementTree
标准模块中使用。请参阅https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write。