2010-12-01 14 views

Respuesta

12

Este es un objeto SimpleXMLElement. La fila '@attributes' es una representación interna del attributes del elemento XML. Use las funciones de SimpleXML para obtener datos de este objeto en lugar de interactuar directamente con él.

+0

Pero ¿por qué se muestra con el signo @? – cambraca

+0

No sé por qué. SimpleXML decidió nombrar el elemento de matriz que, supongo. –

+0

@Rocket No puedo encontrar una manera de incluir @ en un nombre de variable – cambraca

9

Todas esas respuestas sobre el control de errores son incorrectas. @ No significa nada. Así es como se llama internamente la propiedad, pero no confíe en este. No confíe en print_r() o var_dump() al tratar con SimpleXML. SimpleXML realiza muchas cosas "mágicas" que no están representadas correctamente en print_r() y var_dump().

Si necesita saber qué hay dentro de un fragmento de XML, simplemente use ->asXML() en él.

+0

Sí, parece que los objetos de SimpleXMLElement son raros. –

+0

Esta también fue la respuesta correcta, pero no puedo otorgar 2 :( –

+0

Puede desmarcar su elección anterior siempre que quiera cambiar la respuesta aceptada. Ayuda al sitio a no convertirse en una carrera gigante en la que personas al azar publican respuestas aleatorias sobre temas no lo saben, solo para eliminarlos y editarlos más tarde cuando resulta que su respuesta aleatoria fue incorrecta. –

1

Lo sentimos, no puedo comentar como invitado, pero para cualquier persona que termine aquí como lo hice ... Estoy creando mis propios campos de formulario de Joomla y Joomla crea un objeto muy "interesante" de todo tipo de cosas. Ahora, no quería convertirme en un experto en SimpleXML, todo lo que quería era el texto de la etiqueta original que estaba guardado en @attributes.

Después de un poco de "hmmm, I wonder if this works?"™ Me encontraron esta es la forma más fácil de acceder a estos valores:

var_dump($simpleXMLObject); 

/* Result */ 
object(SimpleXMLElement) 
    public '@attributes' => 
    array (size=3) 
     'name' => string 'awesome' 
     'label' => string 'Awesome Label' 
     'type' => string 'typeOfAwesome' 

echo $simpleXMLObject->attributes()->label; // Awesome Label 

$simpleXMLObject->attributes()->label = 'Different Day, Different Awesome'; 
echo $simpleXMLObject->attributes()->label; // Different Day, Different Awesome 

Ellos no estaban mintiendo. Realmente es simple.

0

No tengo suficientes representantes para comentar en user3098738 ... pero quería validar su respuesta. Es realmente así de simple. Cualquier vez que se ejecuta a @attributes en SimpleXML ... usar

$simpleXMLObject->attributes() 
$simpleXMLObject->key->attributes() 
0

estoy trabajando con una API HTTP que da un vistazo a los datos sólo en formato XML. Así que primero lo cargué en SimpleXML y también me desconcertó el problema @attributes. ¿Cómo puedo obtener los valiosos datos que contiene? print_r() me confundió.

Mi solución fue crear una matriz y un iterador variables en 0. Bucle a través de un objeto SimpleXML con foreach y obtener los datos con los attribues método() y cargarlo en mi matriz creada. Iterar antes de que termine el ciclo foreach.

Así print_r() pasó de mostrar esto:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [ID] => 1 
      [First] => John 
      [Last] => Smith 
     ) 
) 

Para una gama mucho más utilizable normal. Lo cual es genial porque quería la opción de convertir rápidamente array en json si fuera necesario.

Mi solución en código:

$obj = simplexml_load_string($apiXmlData); 
$fugly = $obj->Deeply->Nested->XML->Data->Names; 
$people = array(); 
$i = 0; 
foreach($fugly as $val) 
{ 
    $people[$i]['id'] += $val->attributes()->ID; 
    $people[$i]['first'] = "". $val->attributes()->First; 
    $people[$i]['last'] = "". $val->attributes()->Last; 
    $i++; 
} 

Nota rápida sería settype de PHP() es raro/con errores, por lo que agregó el + para asegurarse de ID es un número entero y ha añadido la Cita para asegurarse de que el nombre sea cadena. Si no hay una conversión variable de algún tipo, vas a cargar objetos SimpleXML en la matriz que creaste.

resultado final de print_r():

Array 
(
    [0] => Array 
    (
     [id] => 1 
     [first] => John 
     [last] => Smith 
    ) 

    [1] => Array 
    (
     [id] => 2 
     [first] => Jane 
     [last] => Doe 
    ) 
) 
+0

No responde a estas preguntas. Para leer los atributos, debe usar la sintaxis tipo array - en lugar de 'name-> attribute', use' name ['attribute'] ' – Soaku

Cuestiones relacionadas