【问题标题】:python dicttoxml same key multiple timespython dicttoxml 多次使用相同的键
【发布时间】:2016-06-20 21:49:20
【问题描述】:

我正在尝试做看起来像这样的 xml:

<xml....
<key1>aaa </key1>
<key1>bbb</key1>
<key1>ccc</key1>
</xml>

使用 python dicttoxml 库

试过了:

quest_dict = [{'key1': 'aaa'}, {'key1': 'bbb'}, {'key1': 'ccc'}]
request_xml = dicttoxml.dicttoxml(request_dict, attr_type=False, root=False)

但得到的坏 xml 并不例外。 感谢您的帮助!

【问题讨论】:

  • 您的输出看起来是否与预期不同,或者您是否收到错误消息?

标签: python xml python-2.7


【解决方案1】:

您可以通过使用虚拟类包装键来创建具有重复键的字典,然后在该字典上使用 dicttoxml。如果订单很重要,请使用collections.OrderedDict

from dicttoxml import dicttoxml
from collections import OrderedDict

class Node(object):
    def __init__(self, name):
        self._name = name

    def __str__(self):
        return self._name

quest_dict = OrderedDict([(Node('key1'), 'aaa'), (Node('key1'), 'bbb'), (Node('key1'), 'ccc')])
request_xml = dicttoxml(quest_dict, attr_type=False, root=False)
print(request_xml)

这给出了你想要的输出:

b'<key1>aaa</key1><key1>bbb</key1><key1>ccc</key1>'

【讨论】:

    【解决方案2】:

    您可以使用dicttoxml 方法的custom_rootitem_func 参数获取您期望的xml:

    import dicttoxml
    
    request_dict = ['aaa', 'bbb', 'ccc']
    item_name = lambda x: 'key1'
    request_xml = dicttoxml.dicttoxml(request_dict, attr_type=False, custom_root='xml', item_func=item_name)
    
    print(request_xml.decode('utf-8'))
    

    输出:

    <xml><key1>aaa</key1><key1>bbb</key1><key1>ccc</key1></xml>
    


    此示例的扩展解决了单个 xml 中多个重复键的情况,如 &lt;xsd:element minOccurs="0" maxOccurs="unbounded"&gt; 定义的 我无法使用 Dave 的回答中的 OrderedDict 来实现。最接近的结果是使用 item_func lambda,它以父项的名称命名项目:

    import dicttoxml
    
    xml_dict = {}
    xml_dict['key1'] = ['aaa', 'bbb', 'ccc']
    xml_dict['another-key'] = ['a','b','c']
    
    item_name = lambda x: x
    request_xml = dicttoxml.dicttoxml(xml_dict, attr_type=False, custom_root='xml', item_func=item_name)
    
    print(request_xml.decode('utf-8'))
    

    但是我们必须从结果中删除父母:

    <xml>
        <key1>
            <key1>aaa</key1>
            ...
    

    可以应用清理(显式):

    xml_str = request_xml.decode("utf-8", "strict")
    xml_str = xml_str.replace('<key1><key1>', '<key1>').replace('</key1></key1>', '</key1>')
    xml_str = xml_str.replace('<another-key><another-key>', '<another-key>').replace('</another-key></another-key>', '</another-key>')
    print(xml_str)
    

    结果:

    <xml>
        <key1>aaa</key1>
        ...
        <another-key>a</another-key>
        ...
    </xml>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 2021-06-05
      • 1970-01-01
      • 2011-07-11
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多