utilisez var_dump, vous verrez la structure xml comme des clés à l'intérieur de l'objet.
Magus
3
J'ai [CDATA[TEXT]]quelques éléments à l'intérieur et ils ne sont pas analysés avec cela. Il l'analyse comme un fichier SimpleXMLElement Object. Une solution de contournement pour cela?
Vous pourriez rencontrer des problèmes dans les sections CDATA (renvoyant toujours null). En guise de solution, essayez $ xml = simplexml_load_string ($ xmlstring, null, LIBXML_NOCDATA); $ json = json_encode ($ xml); $ array = json_decode ($ json, TRUE); (voir stackoverflow.com/a/2970701/413531 ) // e putain .. y a-t-il un moyen d'ajouter de nouvelles lignes dans un commentaire?
Hirnhamster
4
Nous faisons exactement la même chose mais avec simplexml_load_file et cela fonctionne bien. Merci
Thermech
2
À quoi sert le deuxième paramètre (TRUE)?
Mansour Fahad
3
@MansourFahad Dans json_decode, vous pouvez utiliser le deuxième paramètre facultatif comme TRUE(normalement par défaut FALSE) pour convertir l'entrée JSON en un tableau associatif.
Jake Bathman
16
@Ismael Miguel trop de code? Ce n'est pas parce que vous mettez toutes ces fonctions sur une seule ligne que vous utilisez moins de code. Cela peut paraître plus compact, mais cela se fait au détriment de la lisibilité.
Jage
44
Conversion d'une chaîne XML ( $buffer) en un tableau simplifié ignorant les attributs et regroupant les éléments enfants avec les mêmes noms:
Si vous souhaitez également avoir les attributs, ils sont disponibles via l'encodage / décodage JSON de SimpleXMLElement. C'est souvent la solution quick'n'dirty la plus simple:
En PHP 7 je devais ajouter ceci: && (is_countable($node) && 1 === count($node) ? $node = array($node) : 1), mais je suis une erreur dans la ligne suivante: [] operator not supported for strings.
andreshg112
@ andreshg112: Je suis incapable de reproduire (fonctionne de manière stable PHP 5.3.0 - 7.4.0), le comportement n'a pas changé depuis des siècles, veuillez comparer avec des centaines de versions de PHP différentes: 3v4l.org/l4nQN
hakre
c'est peut-être à cause de mon fichier KML (c'est un XML). Je ne peux pas le partager. Je l'ai déjà importé mais j'ai dû le faire d'une autre manière.
andreshg112
vous êtes probablement préoccupé par les espaces de noms XML. L'exemple ne concerne que les parties sans espace de noms (ou celui par défaut, je mélange parfois cela).
si vous lancez vers un tableau, vous n'avez pas besoin de json_encodeet json_decode.
Ismael Miguel
11
@Ismael en théorie, la conversion en tableau devrait suffire. En pratique, nous devons également convertir tous les nœuds feuilles, qui sont également des objets. Un casting naïf laisse les feuilles comme des objets SimpleXML. json_encode lance récursivement en sauvant beaucoup de travail.
Peter Mellett
2
Si vous n'avez pas de valeurs de texte dans votre $arrayvariable, c'est peut-être à cause de CDATA. Pour le résoudre, chargez votre XML avec: new SimpleXMLElement($xml, LIBXML_NOCDATA).
Jonathan Petitcolas
1
ps. $ xml = str_replace (tableau ('<! [CDATA [', ']]>'), '', $ xml);
user956584
1
Ça ne marche pas comme ça. Ce code ne convertirait même pas un simple XML comme celui-ci <?xml version="1.0" encoding="UTF-8"?><note a="b"><body c="d">Hello!</body></note>. Exécutez le code et vous verrez que l' attribut <body>c est perdu! Veuillez vérifier le code complet ici si vous ne voulez pas de mauvaises surprises github.com/gaarf/XML-string-to-PHP-array/blob/master/… ou voir ma réponse ci-dessous stackoverflow.com/a/30234924/828366
Francesco Casula
8
Surpris personne n'a mentionné xml_parse_into_struct:
La méthode utilisée dans les attributs de suppression de réponse acceptés lors de la rencontre d'éléments enfants avec uniquement un nœud de texte. Par exemple:
// Convertit XML en tableau et SOAP XML en tableau
function xml2array($contents, $get_attributes =1, $priority ='tag'){if(!$contents)return array();if(!function_exists('xml_parser_create')){// print "'xml_parser_create()' function not found!";return array();}// Get the XML parser of PHP - PHP must have this module for the parser to work
$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,"UTF-8");// http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser, trim($contents), $xml_values);
xml_parser_free($parser);if(!$xml_values)return;//Hmm...// Initializations
$xml_array = array();
$parents = array();
$opened_tags = array();
$arr = array();
$current =& $xml_array;//Refference// Go through the tags.
$repeated_tag_index = array();//Multiple tags with same name will be turned into an arrayforeach($xml_values as $data){
unset($attributes, $value);//Remove existing values, or there will be trouble// This command will extract these variables into the foreach scope// tag(string), type(string), level(int), attributes(array).
extract($data);//We could use the array by itself, but this cooler.
$result = array();
$attributes_data = array();if(isset($value)){if($priority =='tag') $result = $value;else $result['value']= $value;//Put the value in a assoc array if we are in the 'Attribute' mode}// Set the attributes too.if(isset($attributes)and $get_attributes){foreach($attributes as $attr => $val){if( $attr =='ResStatus'){
$current[$attr][]= $val;}if($priority =='tag') $attributes_data[$attr]= $val;else $result['attr'][$attr]= $val;//Set all the attributes in a array called 'attr'}}// See tag status and do the needed.//echo"<br/> Type:".$type;if($type =="open"){//The starting of the tag '<tag>'
$parent[$level -1]=& $current;if(!is_array($current)or(!in_array($tag, array_keys($current)))){//Insert New tag
$current[$tag]= $result;if($attributes_data) $current[$tag .'_attr']= $attributes_data;//print_r($current[$tag . '_attr']);
$repeated_tag_index[$tag .'_'. $level]=1;
$current =& $current[$tag];}else{//There was another element with the same tag nameif(isset($current[$tag][0])){//If there is a 0th element it is already an array
$current[$tag][$repeated_tag_index[$tag .'_'. $level]]= $result;
$repeated_tag_index[$tag .'_'. $level]++;}else{//This section will make the value an array if multiple tags with the same name appear together
$current[$tag]= array(
$current[$tag],
$result
);//This will combine the existing item and the new item together to make an array
$repeated_tag_index[$tag .'_'. $level]=2;if(isset($current[$tag .'_attr'])){//The attribute of the last(0th) tag must be moved as well
$current[$tag]['0_attr']= $current[$tag .'_attr'];
unset($current[$tag .'_attr']);}}
$last_item_index = $repeated_tag_index[$tag .'_'. $level]-1;
$current =& $current[$tag][$last_item_index];}}
elseif ($type =="complete"){//Tags that ends in 1 line '<tag />'// See if the key is already taken.if(!isset($current[$tag])){//New Key
$current[$tag]= $result;
$repeated_tag_index[$tag .'_'. $level]=1;if($priority =='tag'and $attributes_data) $current[$tag .'_attr']= $attributes_data;}else{//If taken, put all things inside a list(array)if(isset($current[$tag][0])and is_array($current[$tag])){//If it is already an array...// ...push the new element into that array.
$current[$tag][$repeated_tag_index[$tag .'_'. $level]]= $result;if($priority =='tag'and $get_attributes and $attributes_data){
$current[$tag][$repeated_tag_index[$tag .'_'. $level].'_attr']= $attributes_data;}
$repeated_tag_index[$tag .'_'. $level]++;}else{//If it is not an array...
$current[$tag]= array(
$current[$tag],
$result
);//...Make it an array using using the existing value and the new value
$repeated_tag_index[$tag .'_'. $level]=1;if($priority =='tag'and $get_attributes){if(isset($current[$tag .'_attr'])){//The attribute of the last(0th) tag must be moved as well
$current[$tag]['0_attr']= $current[$tag .'_attr'];
unset($current[$tag .'_attr']);}if($attributes_data){
$current[$tag][$repeated_tag_index[$tag .'_'. $level].'_attr']= $attributes_data;}}
$repeated_tag_index[$tag .'_'. $level]++;//0 and 1 index is already taken}}}
elseif ($type =='close'){//End of tag '</tag>'
$current =& $parent[$level -1];}}return($xml_array);}// Let's call the this above function xml2array
xml2array($xmlContent, $get_attributes =3, $priority ='tag');// it will work 100% if not ping me @skype: sapan.mohannty// Enjoy coding
J'ai aimé cette question et certaines réponses m'ont été utiles, mais je dois convertir le XML en un tableau de domination, donc je publierai ma solution peut-être que quelqu'un en aura besoin plus tard:
Réponses:
Une autre option est l'extension SimpleXML (je pense qu'elle est fournie en standard avec la plupart des installations php.)
http://php.net/manual/en/book.simplexml.php
La syntaxe ressemble à ceci pour votre exemple
la source
[CDATA[TEXT]]
quelques éléments à l'intérieur et ils ne sont pas analysés avec cela. Il l'analyse comme un fichierSimpleXMLElement Object
. Une solution de contournement pour cela?facile!
la source
TRUE
(normalement par défautFALSE
) pour convertir l'entrée JSON en un tableau associatif.Conversion d'une chaîne XML (
$buffer
) en un tableau simplifié ignorant les attributs et regroupant les éléments enfants avec les mêmes noms:Résultat:
Si vous souhaitez également avoir les attributs, ils sont disponibles via l'encodage / décodage JSON de SimpleXMLElement. C'est souvent la solution quick'n'dirty la plus simple:
Résultat:
Notez que toutes ces méthodes ne fonctionnent que dans l'espace de noms du document XML.
la source
&& (is_countable($node) && 1 === count($node) ? $node = array($node) : 1)
, mais je suis une erreur dans la ligne suivante:[] operator not supported for strings
.la source
json_encode
etjson_decode
.$array
variable, c'est peut-être à cause de CDATA. Pour le résoudre, chargez votre XML avec:new SimpleXMLElement($xml, LIBXML_NOCDATA)
.<?xml version="1.0" encoding="UTF-8"?><note a="b"><body c="d">Hello!</body></note>
. Exécutez le code et vous verrez que l' attribut <body>c
est perdu! Veuillez vérifier le code complet ici si vous ne voulez pas de mauvaises surprises github.com/gaarf/XML-string-to-PHP-array/blob/master/… ou voir ma réponse ci-dessous stackoverflow.com/a/30234924/828366Surpris personne n'a mentionné
xml_parse_into_struct
:la source
Voir https://github.com/gaarf/XML-string-to-PHP-array/blob/master/xmlstr_to_array.php
la source
La méthode utilisée dans les attributs de suppression de réponse acceptés lors de la rencontre d'éléments enfants avec uniquement un nœud de texte. Par exemple:
Ma solution (et j'aimerais pouvoir donner du crédit ici car je suis sûr que j'ai adapté cela à partir de quelque chose):
la source
XML vers tableau
Plus de détails Visitez https://github.com/sapankumarmohanty/lamp/blob/master/Crate-XML-2-Array
// Convertit XML en tableau et SOAP XML en tableau
la source
J'ai aimé cette question et certaines réponses m'ont été utiles, mais je dois convertir le XML en un tableau de domination, donc je publierai ma solution peut-être que quelqu'un en aura besoin plus tard:
la source