Pregunta

Estoy tratando de encontrar la manera de iterar a través de un objeto SimpleXML devuelto.

Estoy usando un kit de herramientas llamada Tarzán AWS , que conecta con Amazon Web Services (SimpleDB, S3, EC2, etc). Estoy usando específicamente SimpleDB.

puedo poner datos en el servicio de Amazon SimpleDB, y puedo recuperarlo. Sólo que no sé cómo manejar el objeto SimpleXML que se devuelve.

La documentación Tarzán AWS dice lo siguiente:

  

Mire la respuesta a navegar a través de las cabeceras 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.

He aquí 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 Qué necesito para obtener a través de cada uno de los artículos objeto? Me gustaría bucle a través de cada uno de ellos y manejarlo como una consulta MySQL ha devuelto. Por ejemplo, puedo consultar SimpleDB y luego de que el bucle de SimpleXML por lo que puede mostrar los resultados en la página.

Por otra parte, ¿cómo convertir todo el asunto en una matriz?

Soy nuevo en SimpleXML, así que me disculpo si mis preguntas no son lo suficientemente específicas.

¿Fue útil?

Solución

Puede utilizar la SimpleXML objeto (o sus propiedades) en una foreach bucle. Si desea colocar a través de algo que todos los registros '' como este puede ser usado para acceder y visualizar 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 $ artículo será un objeto SimpleXML, como es $ atributo, por lo que necesitan ser referenciados como objetos, no matrices.

Mientras que el código de ejemplo anterior es un bucle a través de las matrices en el objeto SimpleXML ($ SimpleXML-> cuerpo-> QueryWithAttributesResult-> Elemento), también se puede recorrer un objeto SimpleXML (digamos $ SimpleXML-> cuerpo-> QueryWithAttributesResult- > artículo [0]), y que le daría cada una de las propiedades del objeto.

Cada elemento hijo de un objeto SimpleXML es una entidad XML. Si la entidad XML (tag) no es único, entonces el elemento es simplemente un conjunto de objetos SimpleXML que representan a cada entidad.

Si lo desea, esto debe crear una matriz de filas / campos más comunes de su objeto SimpleXML (o conseguir cerrar):

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.

Otros consejos

get_object_vars($simpleXMLElement);

una ligera adición para la solución PHP 5.2.

$response_array = json_decode(json_encode($response),true);

En el caso de respuestas XML que no contienen secciones CDATA (como Amazon / de Tarzán), puede utilizar el siguiente suponiendo que tiene PHP 5.2 o posterior.

// 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 siguiente versión principal de Tarzan (CloudFusion 2,5).

Casi todos los ejemplos que encontré se refiere a un ejemplo específico en el que ya conoce los nodos. Siguiendo función convertirá un SimpleXMLElement en una matriz sin conocer los nombres de nodo o si tienen o no del niño. También funciona bien con las secciones 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;
}

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top