Heim  >  Artikel  >  Backend-Entwicklung  >  Problem beim Konvertieren von XML in JSON in PHP

Problem beim Konvertieren von XML in JSON in PHP

coldplay.xixi
coldplay.xixiOriginal
2020-07-23 09:47:023040Durchsuche

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.

Problem beim Konvertieren von XML in JSON in PHP

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");

in

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

in

(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&#39;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(&#39;Could not find file &#39; . $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&#39;Reilly</publisher>
    </book>
<br>
    <book id="3">
        <title>Podcasting Hacks</title>
        <author><first>Jack</first><last>Herrington</last></author>
        <publisher>O&#39;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&#39;Reilly"
 }, {
 "@attributes" : {
 "id" : "3"
 }, 
 "title" : "Podcasting Hacks", "author" : {
 "first" : "Jack", "last" : "Herrington"
 }, 
 "publisher" : "O&#39;Reilly"
 }
 ]}
}

请注意,463aef0d2da08708f472268a99530dbe 元素的 XML 属性 id 作为 "@attributes" 对象的属性被保存在 JSON 数据中,463aef0d2da08708f472268a99530dbe 元素作为对象数组被保存在 JSON 数据中。JSON 输出易于在 JavaScript 代码中使用 eval 语句进行处理。

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn