代码之家  ›  专栏  ›  技术社区  ›  tefozi

将python字典序列化为xml[关闭]

  •  61
  • tefozi  · 技术社区  · 17 年前

    有一个名为“simple json”的简单JSON序列化模块,它可以轻松地将Python对象序列化为JSON。

    我正在寻找可以序列化为XML的类似模块。

    5 回复  |  直到 12 年前
        2
  •  17
  •   max    15 年前

    huTools.structured.dict2xml 它试图与 simplejson 在精神上。您可以给它提示如何包装嵌套的子结构。检查文档 huTools.structured.dict2et 哪些回报 ElementTree 如果字符串由 dict2xml .

    >>> data = {"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,
    ... "ort": u"Hücksenwagen",
    ... "positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},],
    ... "versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h",
    ...                          "anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"},
    ... ]}
    
    >>> print ET.tostring(dict2et(data, 'kommiauftrag',
    ... listnames={'positionen': 'position', 'versandeinweisungen': 'versandeinweisung'}))
    '''<kommiauftrag>
    <anliefertermin>2009-11-25</anliefertermin>
    <positionen>
        <position>
            <posnr>1</posnr>
            <menge>12</menge>
            <artnr>14640/XL</artnr>
        </position>
    </positionen>
    <ort>H&#xC3;&#xBC;cksenwagen</ort>
    <versandeinweisungen>
        <versandeinweisung>
            <bezeichner>avisierung48h</bezeichner>
            <anweisung>48h vor Anlieferung unter 0900-LOGISTIK avisieren</anweisung>
            <guid>2103839-XalE</guid>
        </versandeinweisung>
    </versandeinweisungen>
    <prioritaet>7</prioritaet>
    <kommiauftragsnr>2103839</kommiauftragsnr>
    </kommiauftrag>'''
    
        3
  •  11
  •   nuggetier    14 年前

    试试这个。唯一的问题是我不使用属性(因为我不喜欢它们)
    dict2xml on pynuggets.wordpress.com
    dict2xml on activestate

    from xml.dom.minidom import Document
    import copy
    
    class dict2xml(object):
        doc     = Document()
    
        def __init__(self, structure):
            if len(structure) == 1:
                rootName    = str(structure.keys()[0])
                self.root   = self.doc.createElement(rootName)
    
                self.doc.appendChild(self.root)
                self.build(self.root, structure[rootName])
    
        def build(self, father, structure):
            if type(structure) == dict:
                for k in structure:
                    tag = self.doc.createElement(k)
                    father.appendChild(tag)
                    self.build(tag, structure[k])
    
            elif type(structure) == list:
                grandFather = father.parentNode
                tagName     = father.tagName
                grandFather.removeChild(father)
                for l in structure:
                    tag = self.doc.createElement(tagName)
                    self.build(tag, l)
                    grandFather.appendChild(tag)
    
            else:
                data    = str(structure)
                tag     = self.doc.createTextNode(data)
                father.appendChild(tag)
    
        def display(self):
            print self.doc.toprettyxml(indent="  ")
    
    if __name__ == '__main__':
        example = {'auftrag':{"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,"ort": u"Huecksenwagen","positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},],"versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h","anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"},]}}
        xml = dict2xml(example)
        xml.display()
    
        4
  •  9
  •   Reimund    13 年前

    我编写了一个简单的函数,将字典序列化为XML(少于30行)。

    用途:

    mydict = {
        'name': 'The Andersson\'s',
        'size': 4,
        'children': {
            'total-age': 62,
            'child': [
                {
                    'name': 'Tom',
                    'sex': 'male',
                },
                {
                    'name': 'Betty',
                    'sex': 'female',
                }
            ]
        },
    }
    print(dict2xml(mydict, 'family'))
    

    结果:

    <family name="The Andersson's" size="4">
            <children total-age="62">
                    <child name="Tom" sex="male"/>
                    <child name="Betty" sex="female"/>
            </children>
    </family>
    

    完整的源代码(包括一个示例)可以在 https://gist.github.com/reimund/5435343/

    注: 此函数将字典条目序列化为属性,而不是文本节点。修改它以支持文本将非常容易。

        5
  •  2
  •   rts1    13 年前

    python中的大多数对象表示为下面的dict:

    >>> class Fred(object) : 
    ...    def __init__(self, n) : self.n = n 
    ... 
    >>> a = Fred(100)
    >>> print a.__dict__ 
    {'n': 100}
    

    因此,这类似于询问如何将dict转换为XML。 在以下位置有用于将dict转换为/从XML转换的工具:

    http://www.picklingtools.com

    下面是一个简单的例子:

        >>> import xmltools
    
        >>> d = {'a':1, 'b':2.2, 'c':'three' }
        >>> xx = xmltools.WriteToXMLString(d)
        >>> print xx
        <?xml version="1.0" encoding="UTF-8"?>
        <top>
          <a>1</a>
          <b>2.2</b>
          <c>three</c>
        </top>
    

    网站上有很多文档显示了以下示例:

    XML Tools Manual

    很难在dict和xml之间“精确地”转换:什么是列表?如何处理属性?如何处理数字键?很多这些问题都已经解决了 并在XML工具文档(上面)中讨论。

    速度对你重要吗?还是易用性很重要? 有一个纯C++模块(全部用C++编写),一个纯Python模块(全部用Python编写),和一个Python C扩展模块(用C++编写,但包上这样的Python可以调用它)。C++和Python C扩展模块的数量级更快,但当然需要编译才能开始。python模块应该可以正常工作,但速度较慢: