So konvertieren Sie XML in JSON in PHP: Zuerst müssen Sie SimpleXMLElement verwenden, um den XML-Inhalt in den entsprechenden PHP-Datentyp zu konvertieren. Anschließend müssen Sie die PHP-Daten für den [Services_JSON]-Encoder bereitstellen Endgültige Ausgabe im JSON-Format.
So konvertieren Sie XML in JSON in PHP:
Immer mehr Anwendungen müssen XML in JSON konvertieren. Für diese Art der Konvertierung sind mehrere webbasierte Dienste entstanden. Das IBM T.J. Watson Research Center hat eine spezielle Methode zur Durchführung dieser Konvertierung mit PHP entwickelt. Diese Methode verwendet XML-String-Daten als Eingabe und konvertiert sie in eine JSON-formatierte Datenausgabe. Diese PHP-Lösung bietet folgende Vorteile:
Kann im Standalone-Modus ausgeführt und über die Befehlszeile ausgeführt werden.
kann in vorhandene serverseitige Codeartefakte eingebunden werden.
Einfach als Webdienst im Web gehostet.
Die Konvertierung von XML in JSON erfordert die Verwendung von zwei zentralen PHP-Funktionen:
SimpleXMLElement
Services_JSON
Nur diese beiden Kernfunktionen von PHP werden benötigt, um beliebige XML-Daten in JSON zu konvertieren. Zunächst müssen Sie SimpleXMLElement verwenden, um den XML-Inhalt in den entsprechenden PHP-Datentyp zu konvertieren. Die PHP-Daten werden dann dem Services_JSON-Encoder zugeführt, der wiederum die endgültige JSON-formatierte Ausgabe generiert.
Verwandte Lernempfehlungen: PHP-Programmierung vom Anfänger bis zum Experten
PHP-Code verstehen
Dies Die xml2json-Implementierung besteht aus drei Teilen:
xml2json.php – Diese PHP-Klasse enthält zwei statische Funktionen
xml2json_test.php – führt den xml2json-Test aus Treiber für Konvertierungsfunktion
test1.xml, test2.xml, test3.xml, test4.xml - XML-Dateien unterschiedlicher Komplexität
Der Einfachheit halber werden in diesem Artikel detaillierte Kommentare im Code weggelassen. Die beigefügte Quelldatei enthält jedoch vollständige Kommentare. Vollständige Details zur Programmlogik finden Sie in den beigefügten Quelldateien (siehe Download).
(1) definiert einige zu verwendende Konstanten. Die erste Codezeile importiert die Services_JSON-Implementierung.
(1) definiert die Konstante xml2json.php
require_once 'json/JSON.php'; // Internal program-specific Debug option. define ("DEBUG", false); // Maximum Recursion Depth that we can allow. define ("MAX_RECURSION_DEPTH_ALLOWED", 25); // An empty string define ("EMPTY_STR", ""); // SimpleXMLElement object property name for attributes define ("SIMPLE_XML_ELEMENT_OBJECT_PROPERTY_FOR_ATTRIBUTES", "@attributes"); // SimpleXMLElement object name. define ("SIMPLE_XML_ELEMENT_PHP_CLASS", "SimpleXMLElement");
. Der Codeausschnitt in (2) ist die Eingabefunktion des xml2json-Konverters. Es empfängt XML-Daten als Eingabe, konvertiert die XML-Zeichenfolge in ein SimpleXMLElement-Objekt und sendet es als Eingabe an eine andere (rekursive) Funktion der Klasse. Diese Funktion konvertiert XML-Elemente in assoziative PHP-Arrays. Dieses Array wird dann als Eingabe an den Services_JSON-Encoder übergeben, der die Ausgabe im JSON-Format liefert.
(2) Verwenden Sie xml2json.php
Services_JSON
public static function transformXmlStringToJson($xmlStringContents) { $simpleXmlElementObject = simplexml_load_string($xmlStringContents); <br> if ($simpleXmlElementObject == null) { return(EMPTY_STR); } <br> $jsonOutput = EMPTY_STR; <br> // Let us convert the XML structure into PHP array structure. $array1 = xml2json::convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject); <br> if (($array1 != null) && (sizeof($array1) > 0)) { // Create a new instance of Services_JSON $json = new Services_JSON(); // Let us now convert it to JSON formatted data. $jsonOutput = $json->encode($array1); } // End of if (($array1 != null) && (sizeof($array1) > 0)) <br> return($jsonOutput); } // End of function transformXmlStringToJson
(3) Dieses lange Code-Snippet verwendet die von der PHP-Open-Source-Community (siehe Ressourcen) vorgeschlagene Rekursionstechnologie. Es empfängt ein SimpleXMLElement-Eingabeobjekt und durchläuft rekursiv den verschachtelten XML-Baum. Speichern Sie besuchte XML-Elemente in einem assoziativen PHP-Array. Die maximale Rekursionstiefe kann durch Ändern der in 4 definierten Konstanten geändert werden.
(3) Die Konvertierungslogik in xml2json.php
public static function convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject, &$recursionDepth=0) { // Keep an eye on how deeply we are involved in recursion. <br> if ($recursionDepth > MAX_RECURSION_DEPTH_ALLOWED) { // Fatal error. Exit now. return(null); } <br> if ($recursionDepth == 0) { if (get_class($simpleXmlElementObject) != SIMPLE_XML_ELEMENT_PHP_CLASS) { // If the external caller doesn't call this function initially // with a SimpleXMLElement object, return now. return(null); } else { // Store the original SimpleXmlElementObject sent by the caller. // We will need it at the very end when we return from here for good. $callerProvidedSimpleXmlElementObject = $simpleXmlElementObject; } } // End of if ($recursionDepth == 0) { <br> if (get_class($simpleXmlElementObject) == SIMPLE_XML_ELEMENT_PHP_CLASS) { // Get a copy of the simpleXmlElementObject $copyOfsimpleXmlElementObject = $simpleXmlElementObject; // Get the object variables in the SimpleXmlElement object for us to iterate. $simpleXmlElementObject = get_object_vars($simpleXmlElementObject); } <br> // It needs to be an array of object variables. if (is_array($simpleXmlElementObject)) { // Is the array size 0? Then, we reached the rare CDATA text if any. if (count($simpleXmlElementObject) <= 0) { // Let us return the lonely CDATA. It could even be // an empty element or just filled with whitespaces. return (trim(strval($copyOfsimpleXmlElementObject))); } <br> // Let us walk through the child elements now. foreach($simpleXmlElementObject as $key=>$value) { // When this block of code is commented, XML attributes will be // added to the result array. // Uncomment the following block of code if XML attributes are // NOT required to be returned as part of the result array. /* if($key == SIMPLE_XML_ELEMENT_OBJECT_PROPERTY_FOR_ATTRIBUTES) { continue; } */ <br> // Let us recursively process the current element we just visited. // Increase the recursion depth by one. $recursionDepth++; $resultArray[$key] = xml2json::convertSimpleXmlElementObjectIntoArray($value, $recursionDepth); <br> // Decrease the recursion depth by one. $recursionDepth--; } // End of foreach($simpleXmlElementObject as $key=>$value) { <br> if ($recursionDepth == 0) { // That is it. We are heading to the exit now. // Set the XML root element name as the root [top-level] key of // the associative array that we are going to return to the caller of this // recursive function. $tempArray = $resultArray; $resultArray = array(); $resultArray[$callerProvidedSimpleXmlElementObject->getName()] = $tempArray; } <br> return ($resultArray); } else { // We are now looking at either the XML attribute text or // the text between the XML tags. return (trim(strval($simpleXmlElementObject))); } // End of else } // End of function convertSimpleXmlElementObjectIntoArray.
Nach dem erfolgreichen Durchlaufen des XML-Baums verwendet diese Funktion assoziative PHP-Arrays, um alle XML-Elemente (das Stammelement und alle untergeordneten Elemente) zu konvertieren und zu speichern Elemente). Bei komplexen XML-Dokumenten sind die resultierenden PHP-Arrays ebenso komplex. Sobald das PHP-Array erstellt ist, konvertiert der Services_JSON-Encoder es problemlos in JSON-formatierte Daten. Um die rekursive Logik zu verstehen, sehen Sie sich die archivierten Quelldateien an.
Implementierung des xml2json-Testtreibers
Der Codeausschnitt in (4) ist ein Testtreiber, der die xml2json-Konverterlogik ausführt.
(4)xml2json_test.php
<?php require_once("xml2json.php"); <br> // Filename from where XML contents are to be read. $testXmlFile = ""; <br> // Read the filename from the command line. if ($argc <= 1) { print("Please provide the XML filename as a command-line argument:\n"); print("\tphp -f xml2json_test.php test1.xml\n"); return; } else { $testXmlFile = $argv[1]; } <br> //Read the XML contents from the input file. file_exists($testXmlFile) or die('Could not find file ' . $testXmlFile); $xmlStringContents = file_get_contents($testXmlFile); <br> $jsonContents = ""; // Convert it to JSON now. // xml2json simply takes a String containing XML contents as input. $jsonContents = xml2json::transformXmlStringToJson($xmlStringContents); <br> echo("JSON formatted output generated by xml2json:\n\n"); echo($jsonContents); ?>
Sie können das Programm in der Befehlszeile ausführen, geben Sie den folgenden XML-Dateinamen als Befehlszeilenparameter ein:
php -f xml2json_test.php test2.xml
Ausführen in Über die Befehlszeile liest das Programm den XML-Inhalt aus der Datei in eine String-Variable. Rufen Sie dann die statische Funktion in der Klasse xml2json auf, um das Ergebnis im JSON-Format zu erhalten. Zusätzlich zur Ausführung des Programms über die Befehlszeile können Sie die Logik in dieser Quelldatei ändern, um den xml2json-Konverter mithilfe der Zugriffsprotokolle Simple Object Access Protocol (SOAP) oder Representational State Transfer (REST) als remote aufrufbar verfügbar zu machen. Webdienste. Bei Bedarf kann dieser Remote-Aufruf mit wenigen Modifikationen in PHP implementiert werden.
(5) zeigt eine der vier mit diesem Artikel bereitgestellten Test-XML-Dateien, die zum Testen der xml2json-Implementierung verwendet werden. Sie unterscheiden sich in ihrer Komplexität. Diese Dateien können als Befehlszeilenargumente an den Testtreiber xml2json_test.php übergeben werden.
(5) Testen Sie die xml2json-Implementierung mit test2.xml
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1"> <title>Code Generation in Action</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>Manning</publisher> </book> <br> <book id="2"> <title>PHP Hacks</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>O'Reilly</publisher> </book> <br> <book id="3"> <title>Podcasting Hacks</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>O'Reilly</publisher> </book> </books>
Der in (6) gezeigte Codeausschnitt ist bei Verwendung von test2.xml als Befehlszeilenparameter des Testtreibers xml2json_test.php Ergebnis im JSON-Format.
(6) JSON-formatiertes Ergebnis von test2.xml
{ "books" : { "book" : [ { "@attributes" : { "id" : "1" }, "title" : "Code Generation in Action", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "Manning" }, { "@attributes" : { "id" : "2" }, "title" : "PHP Hacks", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "O'Reilly" }, { "@attributes" : { "id" : "3" }, "title" : "Podcasting Hacks", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "O'Reilly" } ]} }
请注意,
Das obige ist der detaillierte Inhalt vonProblem beim Konvertieren von XML in JSON in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!