Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python生成XML_Python_Xml - Fatal编程技术网

用Python生成XML

用Python生成XML,python,xml,Python,Xml,我正在使用Python开发一个API,它使用XML进行服务器调用。我正在争论是否应该使用库(例如),或者使用字符串连接来生成用于每个请求的XML是否“更好”(意味着开销更少、速度更快)。另外,我将生成的XML将是非常动态的,因此我不确定允许我动态管理元素的东西是否会带来好处。我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能影响将是最小的 虽然,就个人而言,我更喜欢使用(或简单地)代替 我绝对建议您使用其中一个Python库;比如,或者。没有理由不这样做,潜在的性能

我正在使用Python开发一个API,它使用XML进行服务器调用。我正在争论是否应该使用库(例如),或者使用字符串连接来生成用于每个请求的XML是否“更好”(意味着开销更少、速度更快)。另外,我将生成的XML将是非常动态的,因此我不确定允许我动态管理元素的东西是否会带来好处。

我绝对建议您使用其中一个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库libxml2libxslt

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

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>