Hatte jemand von euch schon mal mit Phyton XML
Files nach JSON Files konvertiert oder kenn ein
brauchbares Beispiel und/oder Lib
Das ist nur die JSON Parser Lib
http://docs.python.org/2/library/json.html
Von XML -> JSON
@callsaender: was ist Dein Anwendungsfall? Dateiformate konvertieren sich nicht von alleine. XML ist ein Baum mit Elementen und Attributen, JSON ist die Darstellung verschiedener Grunddatentypen (Liste, Wörterbuch, Zahl, Zeichenkette). Das Vorgehen sieht also so aus: Du parst einen XML-Baum in eine Objektstruktur, die Du dann als JSON-Objekte serialisieren kannst. Das ist ein individueller Vorgang, da man nicht automatisch Objekte aus XML erzeugen kann.
@callsaender: Also mit Phyton habe ich noch nie etwas gemacht. Ich frage mich ob die sich nicht mal ein eigenes Forum zulegen können, damit nicht immer Fragen dazu im Python-Forum landen. 
Wie Sirius3 schon schrieb braucht man irgendeine Vorstellung davon wie Quell- und Zieldokument aussehen und was auf welche Weise von der Quelle zum Ziel abgebildet werden soll. Irgendwer oder -was muss mit JSON ja weiter arbeiten, und da wird es doch gewisse Erwartungen geben.
Es sei denn man will tatsächlich XML allgemein in JSON allgemein überführen. Auch hier gilt immer noch das man irgend eine Vorstellung davon haben muss wie man die Elemente von XML auf die Objekte in JSON abbilden möchte. IBM hatte da mal JsonML erfunden. Ich hoffe inständig es gibt dafür keinen in Python geschriebenen Konverter.
(Der sollte sich aber leicht schreiben lassen, wenn man das als Hausaufgabe oder Übungsaufgabe bekommen hat.)

Wie Sirius3 schon schrieb braucht man irgendeine Vorstellung davon wie Quell- und Zieldokument aussehen und was auf welche Weise von der Quelle zum Ziel abgebildet werden soll. Irgendwer oder -was muss mit JSON ja weiter arbeiten, und da wird es doch gewisse Erwartungen geben.
Es sei denn man will tatsächlich XML allgemein in JSON allgemein überführen. Auch hier gilt immer noch das man irgend eine Vorstellung davon haben muss wie man die Elemente von XML auf die Objekte in JSON abbilden möchte. IBM hatte da mal JsonML erfunden. Ich hoffe inständig es gibt dafür keinen in Python geschriebenen Konverter.

-
- User
- Beiträge: 22
- Registriert: Samstag 23. November 2013, 16:55
>Ich frage mich ob die sich nicht mal ein eigenes Forum zulegen können,
>damit nicht immer Fragen dazu im Python-Forum landen
@BlackJack: Wen meinst Du mit 'die' ?
. Wenn das Thema nicht unter
'Allgemein' passt, werde ich den Admin bitten es in ein passenderes Thema
zu verschieben oder ein neues XML Thema zu machen.
Der Grund für die Konvertierung bei mir ist, das die JSON Datei kleiner ist,
und somit performanter und der Internationalisierung i18n von Dojo,
ein Webside Toolkit, mit JSON arbeitet.
Das alte Language Pack von mir besteht aus einer XML Datei.
Ich hätte den Konverter auch in JavaSkript machen können
aber Phyton schien mir besser geeignet weil das dann
Serverseitig laufen könnte.
@Sirius3: In der XML Datei befindet sich eine Art Wörterbuch.
Also: Ich werde es mal mit dieser Lib Versuchen
https://github.com/martinblech/xmltodict
>damit nicht immer Fragen dazu im Python-Forum landen
@BlackJack: Wen meinst Du mit 'die' ?

'Allgemein' passt, werde ich den Admin bitten es in ein passenderes Thema
zu verschieben oder ein neues XML Thema zu machen.
Der Grund für die Konvertierung bei mir ist, das die JSON Datei kleiner ist,
und somit performanter und der Internationalisierung i18n von Dojo,
ein Webside Toolkit, mit JSON arbeitet.
Das alte Language Pack von mir besteht aus einer XML Datei.
Ich hätte den Konverter auch in JavaSkript machen können
aber Phyton schien mir besser geeignet weil das dann
Serverseitig laufen könnte.
@Sirius3: In der XML Datei befindet sich eine Art Wörterbuch.
Also: Ich werde es mal mit dieser Lib Versuchen
https://github.com/martinblech/xmltodict
Du schreibst ständig etwas von Phython im einem Python-Forum. Offensichtlich verwendest du also eine andere Sprache als der Rest hier.callsaender hat geschrieben:>Ich frage mich ob die sich nicht mal ein eigenes Forum zulegen können,
>damit nicht immer Fragen dazu im Python-Forum landen
@BlackJack: Wen meinst Du mit 'die' ?. Wenn das Thema nicht unter
'Allgemein' passt, werde ich den Admin bitten es in ein passenderes Thema
zu verschieben oder ein neues XML Thema zu machen.
Dann hast du doch ein eindeutiges Quellformat und ein eindeutiges Zielformat. Ein wenig selber programmieren musst du da schon, aber die Transformation wird ja wohl nicht so schwer sein.callsaender hat geschrieben:Das alte Language Pack von mir besteht aus einer XML Datei.
Ich hätte den Konverter auch in JavaSkript machen können
aber Phyton schien mir besser geeignet weil das dann
Serverseitig laufen könnte.
Und bitte hör auf deine Texte selber umzubrechen, die sind kaum lesbar. Deine Textblöcke passen vier bis fünfmal nebeneinander auf meinen Monitor, wegen deiner eigenwilligen Formatierung sieht es einfach nur grausam aus. Noch schlimmer wird es auf dem Smartphone, da kommen zu deinen Zeilenumbrüchen noch zusätzlich welche.
Das Leben ist wie ein Tennisball.
-
- User
- Beiträge: 22
- Registriert: Samstag 23. November 2013, 16:55
Ich dachte das passt hier am besten rein.
Also ich habe eine Datei mit vielen z.B "\u05de" codepage shortcuts und möchte diese in "Klartext übersetzten.
Das hatte ich mir so vorgestellt.
Wenn ich den eingelesen String der Datei wieder schreibe werden die Codepage Shortcuts im File nicht ersetzt
. hat jemand eine Idee wie das Problem zu lösen ist?
Also ich habe eine Datei mit vielen z.B "\u05de" codepage shortcuts und möchte diese in "Klartext übersetzten.
Code: Alles auswählen
define({ root:
({
"root": {
"client": {
"about": {
"text": [
"\u05de\u05e0\u05d4\u05e8\u05d5\u05ea \u05d4\u05db\u05e8\u05de\u05dc 2000",
"\u05d4\u05db\u05e8\u05de\u05dc 2000"
],
"title": "\u05d0\u05d5\u05d3\u05d5\u05ea UZ2000"
}
}
}
})
});
Code: Alles auswählen
# -*- coding: cp1252 -*-
import sys
import xml.etree.ElementTree as ET
import xmltodict
import json
import codecs
import unicodedata
import io
# read string to convert \uxxxx unicode
with open (pathoutJSON, "r") as f:
dataIN = f.read()
f.close()
#data.encode(encoding='UTF-8',errors='strict')
dataOUT = dataIN.decode('utf-8')
#Das z.B. würde funktionieren
#
#with open (pathoutJSON, "w") as f:
# f.write(u'\u4500 blah blah blah\n')
# f.close()
# Aber das nicht :-(
open in update mode with mode='w+'
datafile = codecs.open(pathoutJSON, encoding='utf-8', mode='w+')
datafile.write(dataOUT)
datafile.close()

@callsaender: Was hast Du denn nun *genau*? Beide gezeigten Quelltexte sehen gefaked aus.
Wenn das erste Python 2 Quelltext sein soll, dann musst Du vor die Unicode-Literale ein u setzen, damit es auch tatsächlich Unicode-Literale sind und die Escape-Sequenzen auch zu Unicode-Zeichen ausgewertet werden.
Falls da kein ``define(…`` steht, sondern es sich um eine JSON-Datei handelt, wie der zweite — nicht lauffähige — Quelltext vermuten lässt, dann musst Du das nur als JSON laden und als JSON wieder speichern, und beim Serialisieren halt sagen dass es nicht als ASCII serialisiert werden soll. Die `json.dump()`-Funktion hat dafür ein optionales Argument was normalerweise reines ASCII erzwingt.
Wenn das erste Python 2 Quelltext sein soll, dann musst Du vor die Unicode-Literale ein u setzen, damit es auch tatsächlich Unicode-Literale sind und die Escape-Sequenzen auch zu Unicode-Zeichen ausgewertet werden.
Falls da kein ``define(…`` steht, sondern es sich um eine JSON-Datei handelt, wie der zweite — nicht lauffähige — Quelltext vermuten lässt, dann musst Du das nur als JSON laden und als JSON wieder speichern, und beim Serialisieren halt sagen dass es nicht als ASCII serialisiert werden soll. Die `json.dump()`-Funktion hat dafür ein optionales Argument was normalerweise reines ASCII erzwingt.
-
- User
- Beiträge: 22
- Registriert: Samstag 23. November 2013, 16:55
Also der eigentliche Code sieht so aus und wird bei Python 2.7 verwendet.
Das 'define' brauche für das Ausgabeformat der Datei. Ich werde gucken ob ich das Argument der ASCII Serialisierung finde .
Code: Alles auswählen
jsonDataFile = open(pathoutJSON, mode="w")
jsonDataFile.write("define({ root:\n(")
jsonDataFile.write(json.dumps(doc, indent=4, sort_keys=True, encoding="UTF-8"))
jsonDataFile.write(")\n")
@callsaender: JSON-P in Dateien schreiben habe ich auch noch nicht gesehen. Das schickt man normalerweise zum Browser. 

-
- User
- Beiträge: 22
- Registriert: Samstag 23. November 2013, 16:55
Also mit den sowieso ACSII Zeichen klappt es und im String wird ein u'text'' mit gegeben
Ausgabe der Datei als String während der Abarbeitung:
OrderedDict([(u'root', OrderedDict([(u'client', OrderedDict([(u'about', OrderedD
ict([(u'text', [u'\u05de\u05e0\u05d4\u05e8\u05d5\u05ea \u05d4\u05db\u05e8\u05de\
u05dc 2000', u'\u05d4\u05db\u05e8\u05de\u05dc 2000']), (u'title', u'\u05d0\u05d5
\u05d3\u05d5\u05ea UZ2000')]))]))]))])
Fehlermeldung trotz ensure_ascii=False beim Ausführen von:
jsonDataFile.write(json.dumps(doc, ensure_ascii=False, indent=4, sort_keys=True, encoding="UTF-8"))
Traceback (most recent call last):
File "convert_xml2json03.py", line 89, in <module>
jsonDataFile.write(json.dumps(doc, ensure_ascii=False, indent=4, sort_keys=True))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 106-111: ordinal not in range(128)
Ausgabe der Datei als String während der Abarbeitung:
OrderedDict([(u'root', OrderedDict([(u'client', OrderedDict([(u'about', OrderedD
ict([(u'text', [u'\u05de\u05e0\u05d4\u05e8\u05d5\u05ea \u05d4\u05db\u05e8\u05de\
u05dc 2000', u'\u05d4\u05db\u05e8\u05de\u05dc 2000']), (u'title', u'\u05d0\u05d5
\u05d3\u05d5\u05ea UZ2000')]))]))]))])
Fehlermeldung trotz ensure_ascii=False beim Ausführen von:
jsonDataFile.write(json.dumps(doc, ensure_ascii=False, indent=4, sort_keys=True, encoding="UTF-8"))
Traceback (most recent call last):
File "convert_xml2json03.py", line 89, in <module>
jsonDataFile.write(json.dumps(doc, ensure_ascii=False, indent=4, sort_keys=True))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 106-111: ordinal not in range(128)
@callsaender: `json.dumps()` liefert eine Unicode-Zeichenkette als Ergebnis und `write()` schreibt Bytes. `json.dump()` würde hier auch mehr Sinn machen.
-
- User
- Beiträge: 22
- Registriert: Samstag 23. November 2013, 16:55
Sooo, ab endlich das Problem gelöst 
Das Zauberwort heisst: unicode_escape

Das Zauberwort heisst: unicode_escape
Code: Alles auswählen
# Old
# dataOUT = dataIN.decode('utf-8')
# New :-)
dataOUT = unicode(dataIN, 'unicode_escape')
@callsaender: Nachträgliches Verarbeiten von bereits vorhandenen Dateien mag so vielleicht in Ordnung sein, aber beim schreiben von neuen Dateien sollte man es besser gleich richtig machen.