simplexml_load_string - recorrer simplexmlelement object php
Recorrer un objeto SimpleXML o convertir todo en una matriz (6)
Casi todos los ejemplos que encontré se refieren a un ejemplo específico donde ya conoce los nodos. La siguiente función convertirá un SimpleXMLElement en una matriz sin conocer los nombres de los nodos o si tienen hijos o no. También funcionará bien con las secciones de CDATA.
function parseXML(SimpleXMLElement $xml) : array
{
$array = [];
foreach(iterator_to_array($xml, TRUE) as $key => $value)
$array[$key] = ($value->count() > 1) ? parseXML($value) : (string)$value;
return $array;
}
Estoy intentando averiguar cómo iterar un objeto SimpleXML devuelto.
Estoy usando un kit de herramientas llamado Tarzan AWS , que se conecta a los servicios web de Amazon (SimpleDB, S3, EC2, etc.). Estoy utilizando específicamente SimpleDB.
Puedo poner datos en el servicio Amazon SimpleDB y puedo recuperarlos. Simplemente no sé cómo manejar el objeto SimpleXML que se devuelve.
La documentación de Tarzán AWS dice esto:
Mira la respuesta para navegar a través de los encabezados y el cuerpo de la respuesta. Tenga en cuenta que este es un objeto, no una matriz, y que el cuerpo es un objeto SimpleXML.
Aquí hay una muestra del objeto SimpleXML devuelto:
[body] => SimpleXMLElement Object ( [QueryWithAttributesResult] => SimpleXMLElement Object ( [Item] => Array ( [0] => SimpleXMLElement Object ( [Name] => message12413344443260 [Attribute] => Array ( [0] => SimpleXMLElement Object ( [Name] => active [Value] => 1 ) [1] => SimpleXMLElement Object ( [Name] => user [Value] => john ) [2] => SimpleXMLElement Object ( [Name] => message [Value] => This is a message. ) [3] => SimpleXMLElement Object ( [Name] => time [Value] => 1241334444 ) [4] => SimpleXMLElement Object ( [Name] => id [Value] => 12413344443260 ) [5] => SimpleXMLElement Object ( [Name] => ip [Value] => 10.10.10.1 ) ) ) [1] => SimpleXMLElement Object ( [Name] => message12413346907303 [Attribute] => Array ( [0] => SimpleXMLElement Object ( [Name] => active [Value] => 1 ) [1] => SimpleXMLElement Object ( [Name] => user [Value] => fred ) [2] => SimpleXMLElement Object ( [Name] => message [Value] => This is another message ) [3] => SimpleXMLElement Object ( [Name] => time [Value] => 1241334690 ) [4] => SimpleXMLElement Object ( [Name] => id [Value] => 12413346907303 ) [5] => SimpleXMLElement Object ( [Name] => ip [Value] => 10.10.10.2 ) ) ) )
Entonces, ¿qué código necesito para obtener a través de cada uno de los objetos objeto? Me gustaría recorrer cada uno de ellos y manejarlo como una consulta de MySQL devuelta. Por ejemplo, puedo consultar SimpleDB y luego hacer un bucle en SimpleXML para poder mostrar los resultados en la página.
Alternativamente, ¿cómo convertir todo el shebang en una matriz?
Soy nuevo en SimpleXML, así que me disculpo si mis preguntas no son lo suficientemente específicas.
En el caso de las respuestas XML que NO contienen secciones CDATA (como las de Amazon / Tarzan), puede usar lo siguiente suponiendo que tiene PHP 5.2 o más reciente.
// Get a SimpleXML response back from Tarzan
$s3 = new AmazonS3();
$response = $s3->list_buckets();
// Convert SimpleXML to Array in PHP 5.2.
$response_array = json_decode(json_encode($response));
Esta será una utilidad estándar disponible para todos los objetos en la próxima versión principal de Tarzan (CloudFusion 2.5).
Esto funcionó:
// $result is a Simple XML object
$result = convertSimpleXMLToArray($result);
function convertSimpleXMLToArray($xml)
{
if(class_basename($xml) == ''SimpleXMLElement'')
{
$xml = get_object_vars($xml);
foreach($xml as $key => $value)
{
if(class_basename($value) == ''SimpleXMLElement'') $xml[$key] = convertSimpleXMLToArray($value);
}
}
return $xml;
}
Una pequeña adición para la corrección de PHP 5.2.
$response_array = json_decode(json_encode($response),true);
Puede usar el objeto SimpleXML
(o sus propiedades) en un bucle foreach
. Si desea recorrer todos los "registros", se puede utilizar algo como esto para acceder y mostrar los datos:
//Loop through all the members of the Item array
//(essentially your two database rows).
foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){
//Now you can access the ''row'' data using $Item in this case
//two elements, a name and an array of key/value pairs
echo $Item->Name;
//Loop through the attribute array to access the ''fields''.
foreach($Item->Attribute as $Attribute){
//Each attribute has two elements, name and value.
echo $Attribute->Name . ": " . $Attribute->Value;
}
}
Tenga en cuenta que $ Item será un objeto SimpleXML, como lo es $ Attribute, por lo que deben ser referenciados como objetos, no como matrices.
Mientras que el código de ejemplo anterior recorre las matrices en el objeto SimpleXML ($ SimpleXML-> body-> QueryWithAttributesResult-> Item), también puede recorrer un objeto SimpleXML (digamos $ SimpleXML-> body-> QueryWithAttributesResult-> Item [ 0]), y eso le daría cada una de las propiedades del objeto.
Cada elemento secundario de un objeto SimpleXML es una entidad XML. Si la entidad XML (etiqueta) no es única, entonces el elemento es simplemente una matriz de objetos SimpleXML que representan a cada entidad.
Si lo desea, esto debería crear una matriz de filas / campos más común desde su objeto SimpleXML (o conseguir que se cierre):
foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){
foreach($Item->Attribute as $Attribute){
$rows[$Item->Name][$Attribute->Name] = $Attribute->Value;
}
}
//Now you have an array that looks like:
$rows[''message12413344443260''][''active''] = 1;
$rows[''message12413344443260''][''user''] = ''john'';
//etc.
get_object_vars($simpleXMLElement);