Maison  >  Article  >  développement back-end  >  Problème avec la conversion de XML en JSON en php

Problème avec la conversion de XML en JSON en php

coldplay.xixi
coldplay.xixioriginal
2020-07-23 09:47:023041parcourir

Comment convertir XML en JSON en PHP : Tout d'abord, vous devez utiliser SimpleXMLElement pour convertir le contenu XML dans le type de données PHP approprié, puis fournir les données PHP à l'encodeur [Services_JSON] et enfin générer le fichier ; sortie finale au format JSON.

Problème avec la conversion de XML en JSON en php

Comment convertir XML en JSON en php :

De plus en plus d'applications doivent convertir XML en JSON. Plusieurs services Web ont vu le jour pour effectuer ce type de conversion. Le centre de recherche IBM T.J. Watson a développé une méthode spécialisée pour effectuer cette conversion à l'aide de PHP. Cette méthode prend les données de chaîne XML en entrée et les convertit en sortie de données au format JSON. Cette solution PHP présente les avantages suivants :

  • Peut être exécutée en mode autonome et exécutée depuis la ligne de commande.

  • peut être inclus dans les artefacts de code existants côté serveur.

  • Facilement hébergé en tant que service Web sur le Web.

La conversion XML vers JSON nécessite l'utilisation de deux fonctionnalités PHP principales :

  • SimpleXMLElement

  • Services_JSON

Seules ces deux fonctionnalités PHP de base sont nécessaires pour convertir toutes les données XML en JSON. Tout d'abord, vous devez utiliser SimpleXMLElement pour convertir le contenu XML dans le type de données PHP approprié. Les données PHP sont ensuite transmises à l'encodeur Services_JSON, qui génère à son tour la sortie finale au format JSON.

Recommandations d'apprentissage associées : Programmation PHP du débutant au compétent

Comprendre le code PHP

Ceci L'implémentation de xml2json se compose de trois parties :

  • xml2json.php - Cette classe PHP comprend deux fonctions statiques

  • xml2json_test.php - exécute le test xml2json pilote pour la fonction de conversion

  • test1.xml, test2.xml, test3.xml, test4.xml - Fichiers XML de complexité différente

Par souci de simplicité, cet article omet les commentaires détaillés dans le code. Cependant, les commentaires complets sont inclus dans le fichier source ci-joint. Pour les détails complets de la logique du programme, veuillez consulter les fichiers sources joints (voir téléchargement).

(1) définit quelques constantes à utiliser. La première ligne de code importe l'implémentation Services_JSON.

(1) définit la constante 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");

dans

. L'extrait de code dans (2) est la fonction d'entrée du convertisseur xml2json. Il reçoit des données XML en entrée, convertit la chaîne XML en un objet SimpleXMLElement et l'envoie en entrée à une autre fonction (récursive) de la classe. Cette fonction convertit les éléments XML en tableaux associatifs PHP. Ce tableau est ensuite transmis à l'encodeur Services_JSON comme entrée, ce qui donne la sortie au format JSON.

(2) Utilisez 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

dans

(3) Ce long extrait de code utilise la récursion proposée par la technologie de la communauté open source PHP (voir Ressources). Il reçoit un objet SimpleXMLElement d'entrée et parcourt de manière récursive le long de l'arborescence XML imbriquée. Enregistrez les éléments XML visités dans un tableau associatif PHP. La profondeur de récursion maximale peut être modifiée en modifiant les constantes définies en 4.

(3) La logique de conversion dans 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.

Après avoir parcouru avec succès l'arborescence XML, cette fonction utilise des tableaux associatifs PHP pour convertir et stocker tous les éléments XML (l'élément racine et tous les enfants éléments). Pour les documents XML complexes, les tableaux PHP résultants sont tout aussi complexes. Une fois le tableau PHP construit, l'encodeur Services_JSON le convertit facilement en données au format JSON. Pour comprendre la logique récursive, consultez les fichiers sources archivés.

Implémentation du pilote de test XML2json

L'extrait de code dans (4) est un pilote de test pour exécuter la logique du convertisseur XML2json.

(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);
?>

Vous pouvez exécuter le programme dans la ligne de commande, entrez le nom de fichier XML suivant comme paramètre de ligne de commande :

php -f xml2json_test.php test2.xml

Exécuter dans la ligne de commande, le programme lit le contenu XML du fichier dans une variable chaîne. Appelez ensuite la fonction statique dans la classe xml2json pour obtenir le résultat au format JSON. En plus d'exécuter le programme à partir de la ligne de commande, vous pouvez modifier la logique de ce fichier source pour exposer le convertisseur xml2json en tant qu'appelable à distance à l'aide des protocoles d'accès SOAP (Simple Object Access Protocol) ou REST (Representational State Transfer). Services Web. Si nécessaire, cet appel à distance peut être implémenté en PHP avec seulement quelques modifications.

(5) montre l'un des quatre fichiers XML de test fournis avec cet article, qui sont utilisés pour tester l'implémentation de xml2json. Leur complexité varie. Ces fichiers peuvent être transmis comme arguments de ligne de commande au pilote de test xml2json_test.php.

(5) Test de l'implémentation de xml2json avec 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>

L'extrait de code présenté dans (6) correspond à l'utilisation de test2.xml comme paramètre de ligne de commande du pilote de test xml2json_test.php Résultat au format JSON.

(6) Résultat au format JSON de 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 语句进行处理。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn