Accediendo a @attribute desde SimpleXML


120

Tengo problemas para acceder a la @attributesección de mi objeto SimpleXML. Cuando var_dumpobtengo el objeto completo, obtengo la salida correcta, y cuando obtengo el var_dumpresto del objeto (las etiquetas anidadas), obtengo la salida correcta, pero cuando sigo los documentos y var_dump $xml->OFFICE->{'@attributes'}, obtengo un objeto vacío, a pesar del hecho de que el primero var_dumpmuestra claramente que hay atributos para generar.

¿Alguien sabe qué estoy haciendo mal aquí / cómo puedo hacer que esto funcione?


5
var_dump () es engañoso cuando se trata de SimpleXML. No tome su salida literalmente. Además, ¿no puede acceder a los atributos mediante el acceso a la matriz? por ejemplo, $ xml-> OFFICE ['MyAttribute']?
Frank Farmer

si desea usar ['@attributes'], primero debe convertir el elemento SimpleXMLE en la matriz
Enrique

Respuestas:


88

Puede obtener los atributos de un elemento XML llamando a la función atributos () en un nodo XML. Luego puede var_dump el valor de retorno de la función.

Más información en php.net http://php.net/simplexmlelement.attributes

Código de ejemplo de esa página:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}

7
Curiosamente, $bserá un SimpleXMLElementobjeto así print_ry var_dumpte dará cosas raras. Puedes lanzarlo como una cuerda (o lo que quieras) para evitar esto.
jxmallett

Haz "". $ B para mantenerlo como una cadena
dr_rk

135

Prueba esto

$xml->attributes()->Token

2
Esto ya ha sido respondido por @Artefacto .
hakre

45
Sí, pero en una forma más difícil
zysoft

2
Sí, esta es la solución más elegante.
Christian

He intentado esto y creo que la página se bloquea. Bora parece pensar que este es un formato incorrecto, con lo que estoy de acuerdo en este momento. Sin embargo, he visto este (tu) formato mencionado varias veces. ¿Hay algún matiz que me falta?
Gerard ONeill

2
@GerardONeill, no entiendo por qué Bora dice que es una forma incorrecta de acceder a los atributos, funciona bastante bien. Lo que puede faltar es que necesita llamar attributes()al objeto correspondiente a la etiqueta correcta en su XML. Como si lo <root><tag attr="a">b</tag></root>hiciera, $xml->tag->attributes()->attrdebe hacerlo para acceder a él.
Zysoft

55

Usé antes tantas veces para obtener @attributescomo abajo y fue un poco más largo.

$att = $xml->attributes();
echo $att['field'];

Debería ser más fácil y puede obtener atributos siguiendo el formato solo a la vez:

Modo estándar: atributos de acceso a la matriz (AAA)

$xml['field'];

Otras alternativas son:

Formato correcto y rápido

$xml->attributes()->{'field'};

Formatos incorrectos

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];

1
Estoy de acuerdo con el primero de sus formatos incorrectos porque la página se bloquea; sin embargo, varias personas afirman que esto funciona. ¿Alguna explicación o matiz sobre esto?
Gerard ONeill

1
Los "formatos incorrectos" funcionan. Siempre uso el primer ejemplo. ¿Por qué está mal?
Grzegorz

3
Técnicamente, $xml->attributes()->{'field'}, $xml->attributes()->field, y $f='field'; $xml->attributes()->$f;son los mismos. No ve ninguna razón por la que uno sea un formato correcto y otro incorrecto.
zysoft

$ xml-> atributos () -> {'campo'} es correcto porque es seguro usarlo con caracteres especiales en el nombre del atributo (es decir, "data-attr"). $ xml-> atributos () -> campo solo funciona para atributos que son palabras alfanuméricas individuales
vzr

Obteniendo SimpleXMLElement al usar ambas opciones correctas.
Darius.V

41
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

Utilice SimpleXMLElement::attributes.

La verdad es que el get_propertiescontrolador SimpleXMLElement se encuentra a lo grande. No hay una propiedad llamada "@attributes", por lo que no puede hacerlo $sxml->elem->{"@attributes"}["attrib"].


Gracias por explicar por qué SimpleXML se comporta de esta manera extraña (el get_propertiescontrolador). Muy interesante.
andrewtweber

Obtener SimpleXMLElement al hacer esto en lugar de valor
Darius.V


8

Sin embargo, si está buscando una lista de estos atributos, XPath será su amigo

print_r($xml->xpath('@token'));

3

Me ayudó a convertir el resultado de simplexml_load_file ($ file) en una estructura JSON y volver a decodificarlo:

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)

2

Desafortunadamente, tengo una compilación única (atascada con Gentoo por el momento) de PHP 5.5, y lo que encontré fue que

 $xml->tagName['attribute']

fue la única solución que funcionó. Probé todos los métodos de Bora anteriores, incluido el formato 'Correcto y rápido', y todos fallaron.

El hecho de que este sea el formato más fácil es una ventaja, pero no disfruté pensando que estaba loco probando todos los formatos que otros decían que funcionaban.

Njoy por lo que vale (¿mencioné una construcción única?).


Normalmente recomendaría usar la notación de matriz para los atributos de los atributos en el mismo espacio de nombres del elemento del que forman parte. Yo diría que es el formato más fácil (mientras lo acuñas) por una razón. acceso a matriz con un atributo key = con nombre con elemento simplexml.
hakre
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.