Ich suche ein quasi Pickle, nur in XML. Es sollte eine pure Python Lösung sein. Im Prinzip was xmlrpclib.dumps() und xmlrpclib.loads() macht. Nur diese Produzieren sehr schlecht lesbaren, aufgeblähten XML-Code :( Gleich vorweg, PyYAML3000 wäre auch eine alternative, aber das kann z.Z. nur in Richtung YAML -> Python... 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... 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> ___________________________________________________________________ Und ich kann einfach nicht glauben, das es dafür nicht auch schon was fertiges gibt... Gefunden hab ich es allerdings noch nicht... -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Stefan Behnel schrieb:
ungetestet:
def to_xml(data, **attributes): print "<%s%s>" % (type(data), attributes)
holla, das sollte natürlich so aussehen (immer noch ungetestet): print "<%s%s>" % (type(data), ' '.join( '='.join(a) for a in attributes.items()))
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)
Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Stefan Behnel schrieb:
ungetestet:
Gibt bei mir nur eine Endlosschleife :( -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
jens schrieb:
Stefan Behnel schrieb:
ungetestet:
Gibt bei mir nur eine Endlosschleife :(
Hmm, bei mir gibt das: .>>> ungetestet: File "<stdin>", line 1 ungetestet: ^ SyntaxError: invalid syntax ... oder meintest du meinen ursprünglichen Code? Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Stefan Behnel schrieb:
SyntaxError: invalid syntax
Ich hab es mal weiter verwuschtelt: _____________________________________________ import sys 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}, }, ] def to_xml(data, out, deep=0, **attributes): typ = data.__class__.__name__ attr = [typ] for a in attributes.iteritems(): attr.append('%s="%s"' % a) attr = " ".join(attr) out.write( "%s<%s>" % ("\t"*deep, attr) ) if isinstance(data, dict): out.write("\n") for k,v in data.iteritems(): to_xml(v, out, deep+1, key=k) elif isinstance(data, list): out.write("\n") for e in data: to_xml(e, out, deep+1) else: out.write( "%s%s" % ("\t"*deep, repr(data)) ) out.write( "%s%s\n" % ("\t"*deep,"</%s>" % typ) ) to_xml(t, out=sys.stdout) _____________________________________________ Erzeugt allerdings dumme TABs :( -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Noch ein update: =========================================================== import sys 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}, }, ] def to_xml(data, out, deep=0, **attributes): typ = data.__class__.__name__ attr = [typ] for a in attributes.iteritems(): attr.append('%s="%s"' % a) attr = " ".join(attr) out.write( "%s<%s>" % ("\t"*deep, attr) ) if isinstance(data, dict): out.write("\n") for k,v in data.iteritems(): to_xml(v, out, deep+1, key=k) out.write("\t"*deep) elif isinstance(data, list) or \ isinstance(data, tuple): out.write("\n") for e in data: to_xml(e, out, deep+1) out.write("\t"*deep) else: out.write(repr(data)) out.write("</%s>\n" % typ) to_xml(t, out=sys.stdout) print "-"*79 t = {'foo': {"bar":("jup","jap","schnupp")}} to_xml(t, out=sys.stdout) =========================================================== Erzeugt das: =========================================================== <list> <str>'beispiel'</str> <int>123</int> <str>'noch was'</str> <dict> <str key="status">'GM'</str> <int key="rating">2700</int> </dict> <dict> <str key="status">'Computer'</str> <int key="rating">2700</int> </dict> <dict> <str key="status">'Amateur'</str> <int key="rating">1400</int> </dict> <dict> <dict key="eins"> <int key="a">1</int> <int key="b">2</int> </dict> <dict key="zwei"> <int key="c">2</int> <int key="d">3</int> </dict> </dict> </list> ------------------------------------------------------------------------------- <dict> <dict key="foo"> <tuple key="bar"> <str>'jup'</str> <str>'jap'</str> <str>'schnupp'</str> </tuple> </dict> </dict> =========================================================== Beim letzten kann man aber sehen, an <tuple key="bar"> das es so einfach nicht geht... -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Jens. jens schrieb:
Noch ein update:
=========================================================== import sys
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}, }, ]
def to_xml(data, out, deep=0, **attributes): typ = data.__class__.__name__
attr = [typ] for a in attributes.iteritems(): attr.append('%s="%s"' % a) attr = " ".join(attr)
out.write( "%s<%s>" % ("\t"*deep, attr) )
if isinstance(data, dict): out.write("\n") for k,v in data.iteritems(): to_xml(v, out, deep+1, key=k) out.write("\t"*deep)
elif isinstance(data, list) or \ isinstance(data, tuple): out.write("\n") for e in data: to_xml(e, out, deep+1) out.write("\t"*deep)
else: out.write(repr(data))
Lass mal das repr() weg, dann sehen Strings besser aus. Außerdem solltest du das noch bearbeiten, damit Zeichen wie "<" aus Strings verschwinden. Dafür gibt es im cgi Modul und xml.sax(.saxutils?) Modul Funktionen.
out.write("</%s>\n" % typ)
to_xml(t, out=sys.stdout)
print "-"*79 t = {'foo': {"bar":("jup","jap","schnupp")}} to_xml(t, out=sys.stdout) ===========================================================
Erzeugt das: =========================================================== <list> <str>'beispiel'</str> <int>123</int> <str>'noch was'</str> <dict> <str key="status">'GM'</str> <int key="rating">2700</int> </dict> <dict> <str key="status">'Computer'</str> <int key="rating">2700</int> </dict> <dict> <str key="status">'Amateur'</str> <int key="rating">1400</int> </dict> <dict> <dict key="eins"> <int key="a">1</int> <int key="b">2</int> </dict> <dict key="zwei"> <int key="c">2</int> <int key="d">3</int> </dict> </dict> </list> ------------------------------------------------------------------------------- <dict> <dict key="foo"> <tuple key="bar"> <str>'jup'</str> <str>'jap'</str> <str>'schnupp'</str> </tuple> </dict> </dict> ===========================================================
Beim letzten kann man aber sehen, an <tuple key="bar"> das es so einfach nicht geht...
Versteh ich nicht, für mich sieht das genau so aus, wie es soll: "bar" ist doch der key für das Tuple, oder? Jetzt brauchst du nur noch einen XML Parser (SAX?) und dann kannst du die Struktur Stück für Stück wieder einlesen, indem du die Tag-Namen als Klassen verwendest. Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
jens wrote:
Und ich kann einfach nicht glauben, das es dafür nicht auch schon was fertiges gibt... Gefunden hab ich es allerdings noch nicht...
xml.marshal.wddx.dumps generiert daraus (ohne Formatierung) <?xml version="1.0"?> <!DOCTYPE wddxPacket SYSTEM "wddx_0090.dtd"> <wddxPacket version="0.9"> <header/> <data> <array length="7"> <string>beispiel</string> <number>123</number> <string>noch was</string> <struct> <var name="rating"><number>2700</number></var> <var name="status"><string>GM</string></var> </struct> <struct> <var name="rating"><number>2700</number></var> <var name="status"><string>Computer</string></var> </struct> <struct> <var name="rating"><number>1400</number></var> <var name="status"><string>Amateur</string></var> </struct> <struct> <var name="eins"> <struct> <var name="a"><number>1</number></var> <var name="b"><number>2</number></var> </struct> </var> <var name="zwei"> <struct> <var name="c"><number>2</number></var> <var name="d"><number>3</number></var> </struct> </var> </struct> </array> </data> </wddxPacket> Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Martin v. Löwis schrieb:
xml.marshal.wddx.dumps generiert daraus (ohne Formatierung)
Das ist nett, allerdings ist das ganze Paket mit riesen groß, wenn man nur die XML-dump und XML-load Funktion benötigt ;) -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Ich nehme wohl am einfachsten PyXO ;-) sourcen http://pylucid.python-hosting.com/file/CodeSnippets/PyXO/trunk/PyXO.py readme http://pylucid.python-hosting.com/file/CodeSnippets/PyXO/trunk/PyXO_readme_v... Beispiel: http://www.python-forum.de/viewtopic.php?p=33267#33267 Produziert zwar auch kein hoch optimiertes XML aber wesentlich besser als xmlrpclib ;) Funktioniert in beide Richtungen und kann noch einiges mehr als nur einfache "Elementartypen" verarbeiten -- Mfg. Jens Diemer ---- CMS in pure Python CGI: http://www.pylucid.org _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
jens schrieb:
Ich nehme wohl am einfachsten PyXO ;-)
Produziert zwar auch kein hoch optimiertes XML aber wesentlich besser als xmlrpclib ;) Funktioniert in beide Richtungen und kann noch einiges mehr als nur einfache "Elementartypen" verarbeiten
Wenn's dir vor allem um selbst erstellte Klassen geht, dann kannst du dir vielleicht auch die Namespace Implementierungen von lxml ansehen. http://codespeak.net/svn/lxml/trunk/doc/namespace_extensions.txt Ist zwar nicht ganz so einfach, wie mit PyXO die Klassen in XML reinzuschmeißen, aber dafür hast du vollständige Kontrolle über die XML Struktur. - das nur am Rande. Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
"Martin v. Löwis"
-
jens
-
Stefan Behnel