2016-05-11 3 views
2

Ich möchte this XML file zu JSON mit Julia konvertieren.Konvertieren Sie eine (ziemlich) einfache XML-Datei in JSON mit Julia

Dies ist eine recht einfache XML-Datei mit Tag/Elementen, aber ohne Attribute.

Ich habe einige Online-Tools gefunden, um dies zu tun, aber ich würde vorziehen, nicht auf solche Dienste angewiesen zu sein und meinen eigenen Julia-Code dafür zu haben.

LightXML könnte helfen, für das Parsen

using LightXML 
xdoc = parse_string(s_xml) 
xroot = root(xdoc) 
... 

JSON.jl wird Verwendung zur Ausgabe von JSON-Datei

f = open("my.json", "w") 
JSON.print(f, d) 
close(f) 

sein, aber ich weiß nicht, wie diese XML-Struktur zu durchqueren, eine solche Aufgabe zu erreichen, .

Antwort

1

Wir sind vor ein paar Tagen genau auf dieses Problem gestoßen. Wir haben in Julia keine bereits vorhandene Implementierung gefunden, also haben wir einige Funktionen von Grund auf neu zusammengestellt.

Die grundlegende Lösung bestand darin, das XML mithilfe eines rekursiven Ansatzes zu durchlaufen. Auf dem Weg speichern wir die Tags und Elemente in einer Reihe verschachtelter MultiDict Objekte aus dem DataStructures Paket. Und wie Sie verwenden wir auch das LightXML-Paket, um das XML-Dokument zu analysieren, wenn wir beginnen.

Dann, wenn wir die kompletten XML lesen in unseren verschachtelten MultiDict haben, beginnen wir die MultiDict (auch unter Verwendung von Rekursion) in einen String mit der entsprechenden Formatierung für JSON zu entpacken. Dieser Teil war ein bisschen schwieriger.

Unsere Implementierung ist ziemlich simpel; Zum Beispiel ignorieren wir die XML-Attribute vollständig. Aber ich denke, diese Art von Ansatz (d. H. Rekursion und verschachtelte Multi-Wörterbücher) ist wahrscheinlich nicht lächerlich und sollte Sie auf den richtigen Weg bringen.



Edit:

Unsere Funktionen sind in einem Modul gewickelt. Sie können einen Blick auf here werfen.

+0

Ist Ihr Code verfügbar (oder können Sie ihn verfügbar machen)? –

+0

@ DavidP.Sanders Sicher, ich putze es ein wenig und setze es auf Github. Ich werde den Link ein wenig posten. – paulstey

+0

@paulstey das wird sehr nett sein. –

0

Sie können ein XML-Dokument mit einem einfachen rekursiven Ansatz und LightXML durchlaufen. Hier ist ein grobes Skelett:

using LightXML 

function xout(xelement, mode) 
    if mode == 1 
     println("<",name(xelement), ">") 
    else 
     println("\t{", name(xelement), "}\t", content(xelement)) 
    end 
end 

function parse_node(c) 
    e = XMLElement(c) 
    if length(collect(child_elements(e))) > 0 
     xout(e, 1) 
     for child in child_elements(e) 
      parse_node(child) 
     end 
    else 
     xout(e, 0) 
    end 
end 

xdoc = parse_string(rawxml) 
xroot = root(doc) 

for c in child_elements(xroot) 
    parse_node(c) 
end 

, die für die Datei so etwas wie dies gibt:

<FinancialFunction> 
    {Abbreviation} ACOS 
    {CamelCaseName} Acos 
    {ShortDescription} Vector Trigonometric ACos 
    {GroupId} Math Transform 
<RequiredInputArguments> 
<RequiredInputArgument> 
    {Type} Double Array 
    {Name} inReal 
<OutputArguments> 
<OutputArgument> 
    {Type} Double Array 
    {Name} outReal 
<Flags> 
    {Flag} Line 

Natürlich hat der Spaß gerade erst begonnen! Sie müssen unterscheiden diese verschiedenen <Type> und <Name> Tags für verschiedene Elemente, etc .. Viel Glück!

+0

Es sieht nicht eine JSON-Datei aus –

+0

@FemtoTrader, die Sie gefragt haben "aber ich weiß nicht, wie ich diesen XML-Baum durchquere, um eine solche Aufgabe zu erfüllen.". – daycaster