2009-06-19 15 views
58

Es gibt ein einfaches JSON-Serialisierungsmodul mit dem Namen "simplejson", mit dem Python-Objekte problemlos in JSON serialisiert werden können.Python-Wörterbuch in XML serialisieren

Ich bin auf der Suche nach ähnlichen Modul, die in XML serialisieren können.

Antwort

13
+4

> http://code.activestate.com/recipes/415983/ Diese Datei wird nicht in XML umgewandelt, sondern nur im Marshal-Format. Und ich mag sys.exit auch nicht bei Exception. > http://sourceforge.net/projects/pyxser/ Dies ist nicht BSD. Sorry, ich habe vergessen zu erwähnen, ich suche nach Python-Modul oder BSD, damit ich mit meiner BSD-Software verteilen kann. Die letzten 2 - für Webservices, bin ich auf der Suche nach regulären XML-Serializator. – zinovii

+1

zdmytriv: Sie können eine LGPL-Bibliothek mit Ihrem BSD-Code ohne Verbindlichkeiten verteilen. – nosklo

+0

@nosklo: Ich wusste nicht, dass du das kannst. Jetzt weiß ich, danke. – zinovii

17

Es gibt huTools.structured.dict2xml, die simplejson im Geiste kompatibel zu sein versucht. Sie können Hinweise geben, wie geschachtelte Unterstrukturen zu umbrechen sind. Überprüfen Sie die Dokumentation für huTools.structured.dict2et, die ElementTree Objects stattdessen zurückgibt, wenn die Zeichenfolgen von dict2xml zurückgegeben werden.

>>> 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>''' 
+0

huTools ist nicht kompatibel mit Python 3 ('' ''dict' Objekt hat kein Attribut 'iteritems''''). – thomaskonrad

+0

Was sind die Lizenzbedingungen für dieses Ding? Kann ich meine kommerzielle App verwenden? –

11

versuchen Sie diese. nur Problem, das ich verwende, um Attribute nicht (weil ich sie nicht mag)
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() 
+1

Hier ist ein Problem beim Erstellen einer anderen Instanz von dict2xml 'xml.dom.HierarchyRequestErr: zwei Dokumentelemente nicht erlaubt', , also habe ich unlink Methode hinzugefügt: 'def unlink (self): selb.doc.unlink()' –

2

Die meisten Objekte in Python als dicts unterhalb dargestellt:

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

Das ist also ähnlich wie fragen, wie Dicts in XML konvertiert werden. Es gibt Werkzeuge für die bei dict zu/von XML-Konvertierung:

http://www.picklingtools.com

Hier ist ein einfaches Beispiel:

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

auf der Website eine Vielzahl von Dokumentationen Es gibt Beispiele, die zeigen:

XML Tools Manual

Es ist schwierig, "genau" zwischen dicts und XML zu konvertieren: Was ist a Liste? Was machst du mit Attributen? Wie gehen Sie mit numerischen Schlüsseln um? Viele dieser Probleme wurden behoben und sind in der XML-Tools-Dokumentation (oben) diskutiert.

Ist Ihnen die Geschwindigkeit wichtig? Oder ist Benutzerfreundlichkeit von Bedeutung? Es gibt ein reines C++ - Modul (alles in C++ geschrieben), ein reines Python-Modul (alles in Python geschrieben) und ein Python-C-Erweiterungsmodul (in C++ geschrieben, aber so verpackt, dass Python es aufrufen kann). Das C++ - und das Python C Extension-Modul sind um Größenordnungen schneller, aber natürlich müssen sie kompiliert werden. Das Python-Modul sollte einfach funktionieren, ist aber langsamer:

8

Ich schrieb eine einfache Funktion, die Wörterbücher in xml (unter 30 Zeilen) serialisiert.

Verbrauch:

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

Ergebnis:

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

Die vollständige Quelle (einschließlich Beispiel) auf https://gist.github.com/reimund/5435343/

Hinweis zu finden: Diese Funktion serialisiert Wörterbucheinträge als Attribute statt Textknoten. Es zu modifizieren, um Text zu unterstützen, wäre sehr einfach.

Verwandte Themen