Konvertieren Sie XML mit Javascript in JSON (und zurück)

145

Wie würden Sie von XML nach JSON und dann zurück nach XML konvertieren?

Die folgenden Tools funktionieren recht gut, sind jedoch nicht vollständig konsistent:

Hat jemand diese Situation schon einmal erlebt?

Jason Suárez
quelle
8
Erklären Sie bitte die Unstimmigkeiten
Josh Stodola
4
Insbesondere hatte mit der Konvertierung von JSON-Arrays mit nur 1 Element in XML zu tun. Wenn Sie es zurück in JSON konvertiert haben, wurde anstelle eines 1-Element-Arrays das Objektliteral erstellt. Ich habe es umgangen, indem ich den Typ mit $ .isArray () überprüft und ihn in ein Array eingeschlossen habe, wenn! $. IsArray ().
Jason Suárez
1
xml2json - fyneworks.com/jquery/xml-to-json - bricht Würfe 500 vom 15.02.2013 14:25 AEST
ysrb
Der Link json2xml ist defekt.
Whirlwin
@ysrb Das Plugin-Beispiel funktioniert in IE8 nicht!
Typ

Antworten:

102

Ich denke, das ist das Beste: Konvertieren zwischen XML und JSON

Lesen Sie unbedingt den begleitenden Artikel auf der xml.com O'Reilly-Website , der Einzelheiten zu den Problemen mit diesen Konvertierungen enthält, die Sie meiner Meinung nach aufschlussreich finden werden. Die Tatsache, dass O'Reilly den Artikel hostet, sollte darauf hinweisen, dass Stefans Lösung ihre Berechtigung hat.

Josh Stodola
quelle
danke für die Antwort! In meinem Fall ist JSON die kanonische Darstellung, und XML wird nur für XSLT verwendet. Die Verwendung ist nicht meine Idee! :)
Jason Suárez
Dies ist nur im Browser. Gilt nicht für node.js oder Nicht-Browser-Umgebungen. Irgendwelche anderen Ideen?
Homer6
1
In Bezug auf @ JasonDenizac Kommentar zu seinem Beitrag, bin ich nicht sicher zu verstehen, wie dieser Link hilft, das Problem zu beheben, ein Objekt anstelle eines Arrays von einem Element zu haben ...
Guiomie
1
Ich habe festgestellt, dass diese Bibliothek gut funktioniert, wenn Sie mit json-xml-json beginnen. Wenn Sie jedoch xml-json-xml möchten, gibt es ein Problem mit der Umkehrbarkeit, da Metadaten-XML-Elemente wie <o> und <e>
hinzugefügt werden
3
Bitte beachten Sie, dass dies eine Copyleft-lizenzierte Lösung ist. Dies ist nur eine Option, wenn Sie Open Source-Software schreiben.
Jasper
48

https://github.com/abdmob/x2js - meine eigene Bibliothek (aktualisierte URL von http://code.google.com/p/x2js/ ):

Diese Bibliothek bietet XML für JSON (JavaScript Objects) und umgekehrt JavaScript-Konvertierungsfunktionen. Die Bibliothek ist sehr klein und benötigt keine weiteren zusätzlichen Bibliotheken.

API-Funktionen

  • new X2JS () - um Ihre Instanz für den Zugriff auf alle Bibliotheksfunktionen zu erstellen. Sie können hier auch optionale Konfigurationsoptionen angeben
  • X2JS.xml2json - Konvertiert als DOM-Objekt angegebenes XML in JSON
  • X2JS.json2xml - Konvertiert JSON in ein XML-DOM-Objekt
  • X2JS.xml_str2json - Konvertiert als Zeichenfolge angegebenes XML in JSON
  • X2JS.json2xml_str - Konvertiert JSON in eine XML-Zeichenfolge

Online-Demo unter http://jsfiddle.net/abdmob/gkxucxrj/1/

var x2js = new X2JS();
function convertXml2JSon() {
    $("#jsonArea").val(JSON.stringify(x2js.xml_str2json($("#xmlArea").val())));
}

function convertJSon2XML() {
    $("#xmlArea").val(x2js.json2xml_str($.parseJSON($("#jsonArea").val())));
}

convertXml2JSon();
convertJSon2XML();
$("#convertToJsonBtn").click(convertXml2JSon);
$("#convertToXmlBtn").click(convertJSon2XML);
Abdolenz
quelle
1
Hallo, wie haben Sie das Problem überwunden, dass wenn Sie ein Objekt in einem Objekt haben, es sich im Objektlitter befindet, wenn Sie n> 1 Objekte haben, haben Sie ein Array. Dies macht es schwierig, XML zu verwenden, um Objekte in Vorlagen zu json ...
Guiomie
Ja, Sie sollten einen Trick verwenden, der von Ihrem Wissen über die XML-Struktur abhängt (da hier keine XSD vorhanden ist). Verwenden Sie <Knoten> ... <Knoten> _asArray-Syntax, um auf Ihren Knoten immer als Array (Sequenz)
zuzugreifen
1
Beispiel: // XML-Zeichenfolge zu JSON var xmlText = "<MyOperation> <test> Erfolg </ test> <test2> <item> ddsfg </ item> <item> dsdgfdgfd </ item> </ test2> </ MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); alert (jsonObj.MyOperation.test); alert (jsonObj.MyOperation.test_asArray [0]);
Abdolenz
Mein Hauptproblem ist, wenn ich meinen JSON wieder in XML umwandle, der JSON voller zusätzlicher Eigenschaften ist und wenn die XML-String-Version all das nutzlose Zeug behält. Es hat alle Arten von Kommas und Leerzeichen ...
Guiomie
Könnten Sie Ihr Beispiel an code.google.com/p/x2js/issues senden? Ich werde es überprüfen
Abdolenz
25

Diese Antworten haben mir sehr geholfen, diese Funktion zu erfüllen:

function xml2json(xml) {
  try {
    var obj = {};
    if (xml.children.length > 0) {
      for (var i = 0; i < xml.children.length; i++) {
        var item = xml.children.item(i);
        var nodeName = item.nodeName;

        if (typeof (obj[nodeName]) == "undefined") {
          obj[nodeName] = xml2json(item);
        } else {
          if (typeof (obj[nodeName].push) == "undefined") {
            var old = obj[nodeName];

            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xml2json(item));
        }
      }
    } else {
      obj = xml.textContent;
    }
    return obj;
  } catch (e) {
      console.log(e.message);
  }
}

Solange Sie ein jquery dom / xml-Objekt übergeben: Für mich war es:

Jquery(this).find('content').eq(0)[0]

Wo Inhalt war das Feld, in dem ich meine XML gespeichert habe.

Ryan Conrad
quelle
3

Vor einiger Zeit habe ich dieses Tool https://bitbucket.org/surenrao/xml2json für meine TV Watchlist App geschrieben. Ich hoffe, das hilft auch.

Synopsys: Eine Bibliothek, die nicht nur XML in JSON konvertiert, sondern auch einfach zu debuggen ist (ohne zirkuläre Fehler) und JSON wieder in XML neu erstellt. Features: - Analysiert XML in JSON-Objekt. Drucken Sie das JSON-Objekt zurück in XML. Kann verwendet werden, um XML in IndexedDB als X2J-Objekte zu speichern. Json-Objekt drucken.

Surya
quelle
@kleopatra Dieser Link verweist auf das Tool, das XML in JSON konvertiert. Es ist keine Referenz, sondern der eigentliche Link zur Ressource. Ich
bin
2

Ich würde dieses Tool persönlich empfehlen . Es ist ein XML-zu-JSON-Konverter.

Es ist sehr leicht und in reinem JavaScript. Es braucht keine Abhängigkeiten. Sie können die Funktionen einfach zu Ihrem Code hinzufügen und nach Ihren Wünschen verwenden.

Dabei werden auch die XML-Attribute berücksichtigt.

var xml = ‘<person id=”1234 age=”30”><name>John Doe</name></person>’;
var json = xml2json(xml); 

console.log(json); 
// prints ‘{“person”: {“id”: “1234”, “age”: “30”, “name”: “John Doe”}}’

Hier ist eine Online-Demo !

Samuel Bourgault
quelle
4
Github Repo nicht gefunden
Brauliobo
1

Haftungsausschluss: Ich habe fast-xml-parser geschrieben

Fast XML Parser kann helfen, XML in JSON zu konvertieren und umgekehrt. Hier ist das Beispiel;

var options = {
    attributeNamePrefix : "@_",
    attrNodeName: "attr", //default is 'false'
    textNodeName : "#text",
    ignoreAttributes : true,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : false,
    trimValues: true,
    decodeHTMLchar: false,
    cdataTagName: "__cdata", //default is 'false'
    cdataPositionChar: "\\c",
};
if(parser.validate(xmlData)=== true){//optional
    var jsonObj = parser.parse(xmlData,options);
}

Wenn Sie JSON- oder JS-Objekte in XML analysieren möchten, dann

//default options need not to set
var defaultOptions = {
    attributeNamePrefix : "@_",
    attrNodeName: "@", //default is false
    textNodeName : "#text",
    ignoreAttributes : true,
    encodeHTMLchar: false,
    cdataTagName: "__cdata", //default is false
    cdataPositionChar: "\\c",
    format: false, 
    indentBy: "  ",
    supressEmptyNode: false
};
var parser = new parser.j2xParser(defaultOptions);
var xml = parser.parse(json_or_js_obj);
Amit Kumar Gupta
quelle
: D FXP ist mehr als ein XML 2 JSON-Konverter. Bitte überprüfen Sie die Readme-Datei.
Amit Kumar Gupta
1

Hier ist ein gutes Tool aus einer dokumentierten und sehr bekannten npm-Bibliothek, das die XML-Konvertierungen sehr gut ausführt: Anders als einige (möglicherweise alle) der oben vorgeschlagenen Lösungen werden auch XML-Kommentare konvertiert.

var obj = {name: "Super", Surname: "Man", age: 23};

var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
SimoneMSR
quelle
1

In 6 einfachen ES6-Zeilen:

xml2json = xml => {                                                                                                                                                     
  var el = xml.nodeType === 9 ? xml.documentElement : xml                                                                                                               
  var h  = {name: el.nodeName}                                                                                                                                          
  h.content    = Array.from(el.childNodes || []).filter(e => e.nodeType === 3).map(e => e.textContent).join('').trim()                                                  
  h.attributes = Array.from(el.attributes || []).filter(a => a).reduce((h, a) => { h[a.name] = a.value; return h }, {})                                                 
  h.children   = Array.from(el.childNodes || []).filter(e => e.nodeType === 1).map(c => h[c.nodeName] = xml2json(c))                                                    
  return h                                                                                                                                                              
}  

Testen Sie mit echo "xml2json_example()" | node -r xml2json.es6mit Quelle unter https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

Brauliobo
quelle
0

Ich habe xmlToJson nur verwendet, um einen einzelnen Wert der XML zu erhalten.
Ich fand es viel einfacher, Folgendes zu tun (wenn die XML nur einmal vorkommt ..)

let xml =
'<person>' +
  ' <id>762384324</id>' +
  ' <firstname>Hank</firstname> ' +
  ' <lastname>Stone</lastname>' +
'</person>';

let getXmlValue = function(str, key) {
  return str.substring(
    str.lastIndexOf('<' + key + '>') + ('<' + key + '>').length,
    str.lastIndexOf('</' + key + '>')
  );
}


alert(getXmlValue(xml, 'firstname')); // gives back Hank

Nebulosar
quelle
0

Ich habe eine rekursive Funktion basierend auf Regex erstellt, falls Sie keine Bibliothek installieren und die Logik hinter dem, was passiert, verstehen möchten:

const xmlSample = '<tag>tag content</tag><tag2>another content</tag2><tag3><insideTag>inside content</insideTag><emptyTag /></tag3>';
console.log(parseXmlToJson(xmlSample));

function parseXmlToJson(xml) {
    const json = {};
    for (const res of xml.matchAll(/(?:<(\w*)(?:\s[^>]*)*>)((?:(?!<\1).)*)(?:<\/\1>)|<(\w*)(?:\s*)*\/>/gm)) {
        const key = res[1] || res[3];
        const value = res[2] && parseXmlToJson(res[2]);
        json[key] = ((value && Object.keys(value).length) ? value : res[2]) || null;

    }
    return json;
}

Regex-Erklärung für jede Schleife:

  • res [0] - gibt die XML zurück (wie sie ist)
  • res [1] - Gibt den XML-Tag-Namen zurück
  • res [2] - Gibt den XML-Inhalt zurück
  • res [3] - Gibt den XML-Tag-Namen zurück, falls sich das Tag selbst schließt. Zum Beispiel:<tag />

Sie können hier überprüfen, wie der reguläre Ausdruck funktioniert: https://regex101.com/r/ZJpCAL/1

Hinweis: Falls json einen Schlüssel mit einem undefinierten Wert hat, wird dieser entfernt. Deshalb habe ich am Ende von Zeile 9 null eingefügt.

Meisterstück
quelle
-2

Der beste Weg, dies auf der Serverseite als Client-Seite zu tun, funktioniert nicht in allen Szenarien. Ich habe versucht, einen Online-Konverter von json zu xml und von xml zu json mit Javascript zu erstellen, und ich fühlte mich fast unmöglich, da dies nicht in allen Szenarien funktionierte. Letztendlich habe ich es serverseitig mit Newtonsoft in ASP.MVC gemacht. Hier ist der Online-Konverter http://techfunda.com/Tools/XmlToJson

Sheo Narayan
quelle