Von XML -> JSON

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
callsaender
User
Beiträge: 22
Registriert: Samstag 23. November 2013, 16:55

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
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

@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. :twisted:

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.)
callsaender
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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

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

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"
            }
        }
    }
})
});
Das hatte ich mir so vorgestellt.

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

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

@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.
callsaender
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.

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")
Das 'define' brauche für das Ausgabeformat der Datei. Ich werde gucken ob ich das Argument der ASCII Serialisierung finde .
BlackJack

@callsaender: JSON-P in Dateien schreiben habe ich auch noch nicht gesehen. Das schickt man normalerweise zum Browser. :-)
callsaender
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)
BlackJack

@callsaender: `json.dumps()` liefert eine Unicode-Zeichenkette als Ergebnis und `write()` schreibt Bytes. `json.dump()` würde hier auch mehr Sinn machen.
callsaender
User
Beiträge: 22
Registriert: Samstag 23. November 2013, 16:55

Sooo, ab endlich das Problem gelöst :-)

Das Zauberwort heisst: unicode_escape

Code: Alles auswählen


# Old
# dataOUT = dataIN.decode('utf-8')
# New :-)
dataOUT = unicode(dataIN, 'unicode_escape')

BlackJack

@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.
Antworten