[Python-de] Python string,dict,list und Co. <-> XML

Stefan Behnel behnel_ml at gkec.informatik.tu-darmstadt.de
Fre Mar 17 08:13:32 CET 2006


jens schrieb:
> Ich suche ein quasi Pickle, nur in XML. Es sollte eine pure Python 
> Lösung sein.
> 
> Marc 'BlackJack' Rintsch, hat im Forum mal eben selber was programmiert:
> http://www.python-forum.de/viewtopic.php?p=33200#33200
> 
> Allerdings benötigt man dazu das externe Modul ElementTree. Das wird 
> wohl in Python 2.5 an Board sein, aber solange auf Shared-Hosting-Server 
> ein uralt Python installiert ist, bringt das erstmal auch nix...

Uhm, spricht da was dagegen, das zu installieren? Du überträgst doch ohnehin
deinen Code auf den Server, oder? Eben ein Package mehr...


> Leider ist auch die erzeugte XML-Daten etwas aufgebläht, wenn auch schon 
> um einiges besser als xmlrpclib das macht...
> 
> 
> Ich stelle mir das ganze ungefähr so vor:
> 
> ___________________________________________________________________
> 
> t = [
>      "beispiel", 123, "noch was",
>      {'status':'GM', 'rating':2700},
>      {'status':'Computer', 'rating':2700},
>      {'status':'Amateur', 'rating':1400},
>      {
>          "eins": {"a":1, "b":2},
>          "zwei": {"c":2, "d":3},
>      },
> ]
> 
> 
> <list>
>      <string>beispiel</string>
>      <int>123</int>
>      <string>noch was</string>
>      <dict>
>          <string key="status">GM</string>
>          <int key="rating">2700</int>
>      </dict>
>      <dict>
>          <string key="status">Computer</string>
>          <int key="rating">2700</int>
>      </dict>
>      <dict>
>          <string key="status">Amateur</string>
>          <int key="rating">1400</int>
>      </dict>
>      <dict>
>          <dict key="eins">
>              <dict>
>                  <int key="a">1</int>
>                  <int key="b">2</int>
>              </dict>
>          </dict>
>          <dict key="zwei">
>              <dict>
>                  <int key="c">2</int>
>                  <int key="d">3</int>
>              </dict>
>          </dict>
>      </dict>
> </list>
> ___________________________________________________________________

ungetestet:

def to_xml(data, **attributes):
  print "<%s%s>" % (type(data), attributes)
  if isinstance(data, dict):
     for k,v in data.iteritems():
       print to_xml(v, key=k)
  else:
    try:
       elements = iter(data)
    except TypeError:
       print repr(data)
    else:
       for e in elements:
         to_xml(e)
  print "</%s>" % type(data)

das from_xml() ist ein bisschen komplizierter, XML parsen ist nunmal fdA. Aber
vielleicht bekommst du das ja selbst hin.

Stefan