用Python生成XML
我正在使用Python开发一个API,它使用XML进行服务器调用。我正在争论是否应该使用库(例如),或者使用字符串连接来生成用于每个请求的XML是否“更好”(意味着开销更少、速度更快)。另外,我将生成的XML将是非常动态的,因此我不确定允许我动态管理元素的东西是否会带来好处。我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能影响将是最小的 虽然,就个人而言,我更喜欢使用(或简单地)代替用Python生成XML,python,xml,Python,Xml,我正在使用Python开发一个API,它使用XML进行服务器调用。我正在争论是否应该使用库(例如),或者使用字符串连接来生成用于每个请求的XML是否“更好”(意味着开销更少、速度更快)。另外,我将生成的XML将是非常动态的,因此我不确定允许我动态管理元素的东西是否会带来好处。我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能影响将是最小的 虽然,就个人而言,我更喜欢使用(或简单地)代替 我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能
我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能影响将是最小的 虽然,就个人而言,我更喜欢使用(或简单地)代替
我真正的问题是,对于你想要实现的目标,你最关心的是什么?如果您担心速度/内存,那么是的,minidom确实受到了冲击。如果您想要一些相当可靠的、可以快速部署的东西,我建议您使用它
<我的处理任何语言(java,python,c++,perl等)的XML的建议是考虑使用已经存在的东西。每个人都至少编写过一次自己的XML解析器,但他们再也没有这样做过,因为这是一种后遗症。公平地说,这些库已经解决了99.5%的问题。我真正的问题是,对于您要完成的任务,您最关心的是什么?如果您担心速度/内存,那么是的,minidom确实受到了冲击。如果您想要一些相当可靠的、可以快速部署的东西,我建议您使用它
<我的处理任何语言(java,python,c++,perl等)的XML的建议是考虑使用已经存在的东西。每个人都至少编写过一次自己的XML解析器,但他们再也没有这样做过,因为这是一种后遗症。公平地说,这些库已经修复了99.5%的问题。既然您只是在使用authorize.net,为什么不使用并忘记构建自己的XML调用呢 如果您希望或需要按照自己的方式使用XML,请不要使用minidom,而是使用带有
ElementTree
接口的东西,例如(在标准库中)。这将大大减少痛苦和痛苦。您肯定需要一个XML库来解析生成的XML,因此您也可以对这两个库使用相同的API
使用XML库的开销不太可能是一个问题,干净的代码和知道不能生成无效XML的好处是非常大的
如果您绝对地、肯定地需要尽可能快的速度,请使用Python可用的方法之一。它们可能比任何简单的字符串连接都快得多,而且也很安全(即进行适当的转义)。既然您只是在使用authorize.net,为什么不使用并忘记构造自己的XML调用呢 如果您希望或需要按照自己的方式使用XML,请不要使用minidom,而是使用带有
ElementTree
接口的东西,例如(在标准库中)。这将大大减少痛苦和痛苦。您肯定需要一个XML库来解析生成的XML,因此您也可以对这两个库使用相同的API
使用XML库的开销不太可能是一个问题,干净的代码和知道不能生成无效XML的好处是非常大的
如果您绝对地、肯定地需要尽可能快的速度,请使用Python可用的方法之一。它们可能比任何简单的字符串连接都要快得多,而且也很安全(即正确转义)。我推荐。它是一个Python绑定库,用于非常快速的C库libxml2和libxslt
LXML支持XPATH,并有一个实现。LXML还有一个接口,用于将XML作为对象层次结构写入:
from lxml import etree, objectify
E = objectify.ElementMaker(annotate=False)
my_alpha = my_alpha = E.alpha(E.beta(E.gamma(firstattr='True')),
E.beta(E.delta('text here')))
etree.tostring(my_alpha)
# '<alpha><beta><gamma firstattr="True"/></beta><beta><delta>text here</delta></beta></alpha>'
etree.tostring(my_alpha.beta[0])
# '<beta><gamma firstattr="True"/></beta>'
my_alpha.beta[1].delta.text
# 'text here'
从lxml导入etree,objectify
E=objectify.ElementMaker(注释=False)
my_alpha=my_alpha=E.alpha(E.beta(E.gamma)(firstattr='True')),
E.beta(E.delta('text here'))
etree.tostring(我的字母)
#“此处文本”
etree.tostring(my_alpha.beta[0])
# ''
my_alpha.beta[1].delta.text
#“此处文本”
我推荐。它是一个Python绑定库,用于非常快速的C库libxml2和libxslt
LXML支持XPATH,并有一个实现。LXML还有一个接口,用于将XML作为对象层次结构写入:
from lxml import etree, objectify
E = objectify.ElementMaker(annotate=False)
my_alpha = my_alpha = E.alpha(E.beta(E.gamma(firstattr='True')),
E.beta(E.delta('text here')))
etree.tostring(my_alpha)
# '<alpha><beta><gamma firstattr="True"/></beta><beta><delta>text here</delta></beta></alpha>'
etree.tostring(my_alpha.beta[0])
# '<beta><gamma firstattr="True"/></beta>'
my_alpha.beta[1].delta.text
# 'text here'
从lxml导入etree,objectify
E=objectify.ElementMaker(注释=False)
my_alpha=my_alpha=E.alpha(E.beta(E.gamma)(firstattr='True')),
E.beta(E.delta('text here'))
etree.tostring(我的字母)
#“此处文本”
etree.tostring(my_alpha.beta[0])
# ''
my_alpha.beta[1].delta.text
#“此处文本”
另一种选择是使用,特别是当xml的动态特性相当简单时。这是flask中用于生成html响应的常用习惯用法
下面是一个生成aws S3响应XML的jinja模板示例。我通常将模板存储在单独的文件中,以避免丑陋的xml污染我优雅的python
from datetime import datetime
from jinja2 import Template
list_bucket_result = """<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>{{bucket_name}}</Name>
<Prefix/>
<KeyCount>{{object_count}}</KeyCount>
<MaxKeys>{{max_keys}}</MaxKeys>
<IsTruncated>{{is_truncated}}</IsTruncated>
{%- for object in object_list %}
<Contents>
<Key>{{object.key}}</Key>
<LastModified>{{object.last_modified_date.isoformat()}}</LastModified>
<ETag></ETag>
<Size>{{object.size}}</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>{% endfor %}
</ListBucketResult>
"""
class BucketObject:
def __init__(self, key, last_modified_date, size):
self.key = key
self.last_modified_date = last_modified_date
self.size = size
object_list = [
BucketObject('/foo/bar.txt', datetime.utcnow(), 10*1024 ),
BucketObject('/foo/baz.txt', datetime.utcnow(), 29*1024 ),
]
template = Template(list_bucket_result)
result = template.render(
bucket_name='test-bucket',
object_count=len(object_list),
max_keys=1000,
is_truncated=False,
object_list=object_list
)
print result
从日期时间导入日期时间
从jinja2导入模板
列表_bucket_result=“”
{{bucket_name}}
{{object_count}}
{{max_keys}}
{{is_truncated}}
{%-对象\列表%}中的对象
{{object.key}}
{{object.last_modified_date.isoformat()}}
{{object.size}
标准
{%endfor%}
"""
BucketObject类:
定义初始(自我、密钥、上次修改日期、大小):
self.key=key
self.last\u modified\u date=last\u modified\u date
self.size=大小
obj
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>test-bucket</Name>
<Prefix/>
<KeyCount>2</KeyCount>
<MaxKeys>1000</MaxKeys>
<IsTruncated>False</IsTruncated>
<Contents>
<Key>/foo/bar.txt</Key>
<LastModified>2017-10-31T02:28:34.551000</LastModified>
<ETag></ETag>
<Size>10240</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>/foo/baz.txt</Key>
<LastModified>2017-10-31T02:28:34.551000</LastModified>
<ETag></ETag>
<Size>29696</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>