J'essaie d'analyser xml en utilisant simplexml_load_string sur un ancien serveur exécutant PHP 5.3. L'une des balises du xml est et a plusieurs enfants imbriqués avec un attribut url. Si je var_dump le SimpleXMLElement, les images sont juste un tableau de chaînes (les enfants du nœud de texte de chaque balise) sans signe de l'attribut url.
Avez-vous une idée de la raison pour laquelle l'attribut url des balises n'est pas capturé?
J'ai essayé de raccourcir les attributs d'URL des balises d'image à environ 15 caractères et ils ne sont toujours pas capturés. / p>
J'ai essayé d'accéder aux attributs en tant qu'élément de tableau de l'élément image ainsi qu'en appelant la méthode attributes () sur l'élément image.
Exemple de XML
XXX
Mon code
object(SimpleXMLElement)#5 (1) { ["image"]=> array(19) { [0]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(1) { ["url"]=> string(162) "https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg" } } [text]=> "A2970_10776141.jpg" } ... } }
Résultat
foreach ($property->images as $image) { var_dump($image['url']); var_dump($image->attributes()); }
J'ai aussi essayé:
object(SimpleXMLElement)#5 (1) { ["image"]=> array(19) { [0]=> string(18) "A2970_10776141.jpg" [1]=> string(18) "A2970_10776142.jpg" ... } }
$ image ['url'] renvoie NULL
$ image-> attributes () renvoie une erreur lors de l'appel des attributs () sur un non-objet
Idéalement, var_dumping $ property-> images donnerait:
$feed = file_get_contents('test.xml'); $properties = simplexml_load_string($feed); foreach ($properties as $property) { var_dump($property->images); exit; }
3 Réponses :
J'ai oublié à quel point je détestais SimpleXML. Cela a fonctionné pour moi:
<?php $feed = file_get_contents('test.xml'); $properties = simplexml_load_string($feed); foreach ($properties as $property) { foreach($property->images[0] as $image) { print($image['url'] . "\n"); } }
Vous n'utilisez pas la valeur correcte pour votre boucle foreach, vous devriez en fait utiliser $ property-> images-> image
car ce sont ces éléments que vous souhaitez parcourir. Après cela, vous pouvez choisir parmi les méthodes pour accéder à l'attribut url
:
https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_AwVzHs_Ajc3bPh6tAooCEbZkq_ZYbRT5eAjUXsq3Znh_f~Vw--.jpg https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_AwVzHs_Ajc3bPh6tAooCEbZkq_ZYbRT5eAjUXsq3Znh_f~Vw--.jpg
Sortie:
$properties = simplexml_load_string($feed); foreach ($properties as $property) { foreach ($property->images->image as $image) { echo $image['url'] . PHP_EOL; echo $image->attributes()['url'] . PHP_EOL; } }
Les attributs xml imbriqués sont un peu problématiques lors de l'utilisation de php simplexml les attributs enfants ne sont pas capturés par simplexml.
Mais, vous pouvez simplement utiliser cette fonction. cela obtiendra récursivement tous les attributs xml.
function parseXMLtoArray($xml){ $x = simplexml_load_string($xml); $result = []; function parse($xml, &$res){ $res['name'] = $xml->getName(); $res['value'] = $xml->__toString(); foreach ($xml->attributes() as $k => $v){ $res['attr'][$k] = $v->__toString(); } foreach($xml->children() as $child){ parse($child, $res['children'][]); } } parse($x, $result); return $result; } $resArray = parseXMLtoArray($rawXml); print_r($resArray);