Ich versuche, XML in PHP in JSON zu konvertieren. Wenn ich eine einfache Konvertierung mit einfacher XML und json_encode durchführe, wird keines der Attribute in der XML angezeigt.
$xml = simplexml_load_file("states.xml");
echo json_encode($xml);
Also versuche ich es manuell so zu analysieren.
foreach($xml->children() as $state)
{
$states[]= array('state' => $state->name);
}
echo json_encode($states);
und die Ausgabe für Zustand ist {"state":{"0":"Alabama"}}
eher als{"state":"Alabama"}
Was mache ich falsch?
XML:
<?xml version="1.0" ?>
<states>
<state id="AL">
<name>Alabama</name>
</state>
<state id="AK">
<name>Alaska</name>
</state>
</states>
Ausgabe:
[{"state":{"0":"Alabama"}},{"state":{"0":"Alaska"}
var dump:
object(SimpleXMLElement)#1 (1) {
["state"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#3 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AL"
}
["name"]=>
string(7) "Alabama"
}
[1]=>
object(SimpleXMLElement)#2 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AK"
}
["name"]=>
string(6) "Alaska"
}
}
}
var_dump
funktioniert gut.)Antworten:
Json & Array aus XML in 3 Zeilen:
quelle
<person my-attribute='name'>John</person>
wird interpretiert als<person>John</person>
.@attributes
Schlüssel gespeichert , sodass es absolut fehlerfrei und wunderschön funktioniert. 3 kurze Codezeilen lösen mein Problem wunderbar.<list><item><a>123</a><a>456</a></item><item><a>123</a></item></list>
->{"item":[{"a":["123","456"]},{"a":"123"}]}
. Eine Lösung , bei php.net durch ratfactor löst dieses Problem , indem sie immer speichernde Elemente in einem Array.Es tut uns leid, dass Sie einen alten Beitrag beantwortet haben, aber dieser Artikel beschreibt einen Ansatz, der relativ kurz, prägnant und leicht zu pflegen ist. Ich habe es selbst getestet und funktioniert ziemlich gut.
http://lostechies.com/seanbiefeld/2011/10/21/simple-xml-to-json-with-php/
quelle
Ich habe es herausgefunden. json_encode behandelt Objekte anders als Zeichenfolgen. Ich habe das Objekt in eine Zeichenfolge umgewandelt und es funktioniert jetzt.
quelle
Ich glaube, ich bin etwas spät dran, aber ich habe eine kleine Funktion geschrieben, um diese Aufgabe zu erfüllen. Es kümmert sich auch um Attribute, Textinhalte und selbst wenn mehrere Knoten mit demselben Knotennamen Geschwister sind.
Haftungsausschluss: Ich bin kein PHP-Muttersprachler. Bitte tragen Sie einfache Fehler.
Anwendungsbeispiel:
Beispiel Eingabe (myfile.xml):
Beispielausgabe:
Ziemlich gedruckt:
Macken, die Sie beachten sollten: Mehrere Tags mit demselben Tagnamen können Geschwister sein. Andere Lösungen werden höchstwahrscheinlich alle außer dem letzten Geschwister fallen lassen. Um dies zu vermeiden, ist jeder einzelne Knoten, selbst wenn er nur ein untergeordnetes Element hat, ein Array, das ein Objekt für jede Instanz des Tagnamens enthält. (Siehe mehrere "" Elemente im Beispiel)
Sogar das Stammelement, von dem nur eines in einem gültigen XML-Dokument vorhanden sein sollte, wird als Array mit einem Objekt der Instanz gespeichert, um eine konsistente Datenstruktur zu erhalten.
Um zwischen XML-Knoteninhalt und XML-Attributen unterscheiden zu können, werden alle Objektattribute im "$" und der Inhalt im untergeordneten Element "_" gespeichert.
Bearbeiten: Ich habe vergessen, die Ausgabe für Ihre Beispiel-Eingabedaten anzuzeigen
quelle
$xml = simplexml_load_file("myfile.xml",'SimpleXMLElement',LIBXML_NOCDATA);
.Fatal error: Uncaught Error: Call to a member function getName() on bool
.. ich denke, eine Version PHP ist fehlgeschlagen :-( .. bitte helfen!Eine häufige Gefahr besteht darin, zu vergessen, dass
json_encode()
Elemente mit einem Textwert und Attributen nicht berücksichtigt werden. Es wird eine davon auswählen, was Datenverlust bedeutet. Die folgende Funktion löst dieses Problem. Wenn man sich für denjson_encode
/decode
Weg entscheidet, wird die folgende Funktion empfohlen.auf diese Weise
<foo bar="3">Lorem</foo>
wird nicht wie{"foo":"Lorem"}
in Ihrem JSON enden .quelle
$dom
? Woher kommt das?Versuchen Sie dies zu verwenden
Oder
Sie können diese Bibliothek verwenden: https://github.com/rentpost/xml2array
quelle
Ich habe Miles Johnsons TypeConverter für diesen Zweck verwendet. Es kann mit Composer installiert werden .
Sie könnten so etwas damit schreiben:
quelle
Antonio Max Antwort optimieren:
quelle
Wenn Sie nur einen bestimmten Teil des XML in JSON konvertieren möchten, können Sie XPath verwenden, um dies abzurufen und in JSON zu konvertieren.
Bitte beachten Sie, dass wenn Ihr Xpath falsch ist, dies mit einem Fehler stirbt. Wenn Sie dies über AJAX-Aufrufe debuggen, empfehle ich Ihnen, auch die Antwortkörper zu protokollieren.
quelle
quelle
Beste Lösung, die wie ein Zauber funktioniert
Quelle
quelle
Dies ist eine Verbesserung der am besten bewerteten Lösung von Antonio Max, die auch mit XML mit Namespaces funktioniert (indem der Doppelpunkt durch einen Unterstrich ersetzt wird). Es hat auch einige zusätzliche Optionen (und analysiert
<person my-attribute='name'>John</person>
korrekt).quelle
<element/>
, adressiert keine Elemente, die mit beginnen oder Unterstriche enthalten, was in XML zulässig ist. CDATA kann nicht erkannt werden. Und wie gesagt, es ist langsam. Es ist eine O (n ^ 2) -Komplexität aufgrund innerer Analyse.Alle Lösungen hier haben Probleme!
... wenn die Darstellung eine perfekte XML-Interpretation benötigt (ohne Probleme mit Attributen) und um alle Text-Tag-Text-Tag-Text -... und die Reihenfolge der Tags zu reproduzieren. Denken Sie auch daran, dass das JSON-Objekt "eine ungeordnete Menge" ist (keine Wiederholungsschlüssel und die Schlüssel können keine vordefinierte Reihenfolge haben) ... Auch ZFs xml2json ist falsch (!), Da die XML-Struktur nicht genau beibehalten wird.
Alle Lösungen hier haben Probleme mit diesem einfachen XML,
... @FTav-Lösung scheint besser als 3-Zeilen-Lösung, hat aber auch kleine Fehler, wenn mit diesem XML getestet.
Alte Lösung ist die beste (für verlustfreie Darstellung)
Die heute als jsonML bekannte Lösung wird vom Zorba-Projekt und anderen verwendet und wurde erstmals in den Jahren ~ 2006 oder ~ 2007 von (separat) Stephen McKamey und John Snelson vorgestellt .
Produzieren
Siehe http://jsonML.org oder github.com/mckamey/jsonml . Die Produktionsregeln dieses JSON basieren auf dem Element JSON-analog,
Diese Syntax ist eine Elementdefinition und Wiederholung mit
element-list ::= element ',' element-list | element
.quelle
Nachdem ich alle Antworten ein wenig recherchiert hatte, fand ich eine Lösung, die mit meinen JavaScript-Funktionen in allen Browsern (einschließlich Konsolen / Entwicklertools) einwandfrei funktioniert:
Es erstellt im Grunde ein neues DOMDocument, lädt eine XML-Datei und durchläuft jeden der Knoten und untergeordneten Knoten, um die Daten / Parameter abzurufen und ohne die lästigen "@" - Zeichen in JSON zu exportieren.
Link zur XML- Datei.
quelle
Diese Lösung verarbeitet Namespaces, Attribute und erzeugt konsistente Ergebnisse mit sich wiederholenden Elementen (immer im Array, auch wenn nur ein Vorkommen vorliegt). Inspiriert von sxiToArray () von ratfactor .
Beispiel:
quelle
Die Antwort von FTav war am nützlichsten, da sie sehr anpassbar ist, aber seine xml2js- Funktion weist einige Mängel auf. Wenn untergeordnete Elemente beispielsweise gleiche Tagnamen haben, werden sie alle in einem einzelnen Objekt gespeichert. Dies bedeutet, dass die Reihenfolge der Elemente nicht beibehalten wird. In einigen Fällen möchten wir die Reihenfolge wirklich beibehalten, daher speichern wir die Daten jedes Elements besser in einem separaten Objekt:
So funktioniert es. Anfängliche XML-Struktur:
Ergebnis JSON:
quelle
Es sieht so aus, als ob die
$state->name
Variable ein Array enthält. Sie können verwendenin der
foreach
, um das zu testen.In diesem Fall können Sie die Zeile innerhalb von
foreach
to ändernum es zu korrigieren.
quelle
quelle
Wenn Sie Ubuntu-Benutzer sind, installieren Sie XML-Reader (ich habe PHP 5.6. Wenn Sie andere haben, finden Sie bitte Paket und installieren)
quelle