J'essaie de convertir xml en json en php. Si je fais une simple conversion en utilisant du xml simple et json_encode aucun des attributs dans le spectacle xml.
$xml = simplexml_load_file("states.xml");
echo json_encode($xml);
J'essaye donc de l'analyser manuellement comme ceci.
foreach($xml->children() as $state)
{
$states[]= array('state' => $state->name);
}
echo json_encode($states);
et la sortie de l'état est {"state":{"0":"Alabama"}}
plutôt que{"state":"Alabama"}
Qu'est-ce que je fais mal?
XML:
<?xml version="1.0" ?>
<states>
<state id="AL">
<name>Alabama</name>
</state>
<state id="AK">
<name>Alaska</name>
</state>
</states>
Production:
[{"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
fonctionne bien.)Réponses:
Json & Array de XML en 3 lignes:
la source
<person my-attribute='name'>John</person>
est interprété comme<person>John</person>
.@attributes
clé, donc cela fonctionne parfaitement et parfaitement. 3 courtes lignes de code résolvent magnifiquement mon problème.<list><item><a>123</a><a>456</a></item><item><a>123</a></item></list>
->{"item":[{"a":["123","456"]},{"a":"123"}]}
. Une solution sur php.net par ratfactor résout ce problème en stockant toujours les éléments dans un tableau.Désolé d'avoir répondu à un ancien message, mais cet article décrit une approche relativement courte, concise et facile à maintenir. Je l'ai testé moi-même et fonctionne plutôt bien.
http://lostechies.com/seanbiefeld/2011/10/21/simple-xml-to-json-with-php/
la source
Je l'ai compris. json_encode gère les objets différemment des chaînes. J'ai jeté l'objet en une chaîne et cela fonctionne maintenant.
la source
Je suppose que je suis un peu en retard à la fête mais j'ai écrit une petite fonction pour accomplir cette tâche. Il prend également en charge les attributs, le contenu du texte et même si plusieurs nœuds avec le même nom de nœud sont des frères.
Avertissement: je ne suis pas natif de PHP, alors veuillez supporter de simples erreurs.
Exemple d'utilisation:
Exemple d'entrée (myfile.xml):
Exemple de sortie:
Joli imprimé:
Bizarreries à garder à l'esprit: plusieurs balises avec le même nom de variable peuvent être des frères et sœurs. D'autres solutions abandonneront probablement tout sauf le dernier frère. Pour éviter cela, chaque nœud, même s'il n'a qu'un seul enfant, est un tableau qui contient un objet pour chaque instance de la variable. (Voir plusieurs éléments "" dans l'exemple)
Même l'élément racine, dont un seul devrait exister dans un document XML valide, est stocké sous forme de tableau avec un objet de l'instance, juste pour avoir une structure de données cohérente.
Pour pouvoir faire la distinction entre le contenu du nœud XML et les attributs XML, les attributs de chaque objet sont stockés dans le "$" et le contenu dans l'enfant "_".
Edit: j'ai oublié d'afficher la sortie de votre exemple de données d'entrée
la source
$xml = simplexml_load_file("myfile.xml",'SimpleXMLElement',LIBXML_NOCDATA);
.Fatal error: Uncaught Error: Call to a member function getName() on bool
.. je pense qu'une version php est un échec :-( .. s'il vous plaît aider!Un écueil courant est d'oublier que
json_encode()
ne respecte pas les éléments avec une valeur de texte et un ou plusieurs attributs. Il en choisira un, signifiant dataloss. La fonction ci-dessous résout ce problème. Si l'on décide d'opter pour la voiejson_encode
/decode
, la fonction suivante est conseillée.ce faisant,
<foo bar="3">Lorem</foo>
ne finira pas comme{"foo":"Lorem"}
dans votre JSON.la source
$dom
? D'où vient cela?Essayez d'utiliser ceci
Ou
Vous pouvez utiliser cette bibliothèque: https://github.com/rentpost/xml2array
la source
J'ai utilisé le TypeConverter de Miles Johnson à cette fin. Il peut être installé à l'aide de Composer .
Vous pouvez écrire quelque chose comme ceci en l'utilisant:
la source
Optimisation de la réponse d'Antonio Max:
la source
Si vous souhaitez uniquement convertir une partie spécifique du XML en JSON, vous pouvez utiliser XPath pour le récupérer et le convertir en JSON.
Veuillez noter que si votre Xpath est incorrect, cela mourra avec une erreur. Donc, si vous déboguez cela via des appels AJAX, je vous recommande de consigner également les corps de réponse.
la source
la source
Meilleure solution qui fonctionne comme un charme
La source
la source
Il s'agit d'une amélioration de la solution la plus votée d'Antonio Max, qui fonctionne également avec XML qui a des espaces de noms (en remplaçant les deux points par un trait de soulignement). Il a également quelques options supplémentaires (et analyse
<person my-attribute='name'>John</person>
correctement).la source
<element/>
, ne parvient pas à adresser les éléments qui commencent par ou contiennent des traits de soulignement, ce qui est autorisé dans XML. Ne parvient pas à détecter CDATA. Et comme je l'ai dit, c'est LENT. C'est une complexité O (n ^ 2) à cause de l'analyse interne.Toutes les solutions ici ont des problèmes!
... Lorsque la représentation nécessite une interprétation XML parfaite (sans problèmes d'attributs) et de reproduire tout le texte-tag-texte-tag-texte -... et l'ordre des balises. Rappelez-vous également ici que l' objet JSON "est un ensemble non ordonné" (pas de répétition des clés et les clés ne peuvent pas avoir un ordre prédéfini) ... Même le xml2json de ZF est faux (!) Car il ne conserve pas exactement la structure XML.
Toutes les solutions ici ont des problèmes avec ce XML simple,
... La solution @FTav semble meilleure que la solution 3 lignes, mais elle a aussi peu de bogue lorsqu'elle est testée avec ce XML.
L'ancienne solution est la meilleure (pour une représentation sans perte)
La solution, aujourd'hui connue sous le nom de jsonML , est utilisée par le projet Zorba et d'autres, et a été présentée pour la première fois en ~ 2006 ou ~ 2007, par (séparément) Stephen McKamey et John Snelson .
Produire
Voir http://jsonML.org ou github.com/mckamey/jsonml . Les règles de production de ce JSON sont basées sur l' élément JSON-analogique,
Cette syntaxe est une définition d' élément et une récurrence, avec
element-list ::= element ',' element-list | element
.la source
Après avoir recherché un peu toutes les réponses, j'ai trouvé une solution qui fonctionnait très bien avec mes fonctions JavaScript sur tous les navigateurs (y compris les consoles / outils de développement):
Il crée essentiellement un nouveau DOMDocument, y charge un fichier XML et parcourt chacun des nœuds et des enfants en récupérant les données / paramètres et en les exportant en JSON sans les signes "@" ennuyeux.
Lien vers le fichier XML .
la source
Cette solution gère les espaces de noms, les attributs et produit un résultat cohérent avec des éléments répétitifs (toujours dans un tableau, même s'il n'y a qu'une seule occurrence). Inspiré par sxiToArray () de ratfactor .
Exemple:
la source
J'ai trouvé la réponse de FTav la plus utile car elle est très personnalisable, mais sa fonction xml2js présente quelques défauts. Par exemple, si les éléments enfants ont des noms de variables égaux, ils seront tous stockés dans un seul objet, cela signifie que l'ordre des éléments ne sera pas conservé. Dans certains cas, nous voulons vraiment préserver l'ordre, il vaut donc mieux stocker les données de chaque élément dans un objet séparé:
Voici comment cela fonctionne. Structure xml initiale:
Résultat JSON:
la source
On dirait que la
$state->name
variable contient un tableau. Vous pouvez utiliserà l'intérieur du
foreach
pour tester cela.Si tel est le cas, vous pouvez modifier la ligne à l' intérieur du
foreach
àpour le corriger.
la source
la source
Si vous êtes un utilisateur ubuntu, installez le lecteur xml (j'ai php 5.6.Si vous en avez d'autres, veuillez trouver le package et l'installer)
la source