Accéder à @attribute depuis SimpleXML


120

J'ai un problème pour accéder à la @attributesection de mon objet SimpleXML. Quand je suis var_dumpl'objet entier, j'obtiens la sortie correcte, et quand je suis var_dumple reste de l'objet (les balises imbriquées), j'obtiens la sortie correcte, mais quand je suis la documentation et var_dump $xml->OFFICE->{'@attributes'}, j'obtiens un objet vide, malgré le fait que le premier var_dumpmontre clairement qu'il y a des attributs à produire.

Quelqu'un sait ce que je fais de mal ici / comment puis-je faire en sorte que cela fonctionne?


5
var_dump () est trompeur, quand il s'agit de SimpleXML. Ne prenez pas sa sortie à la lettre. De plus, ne pouvez-vous pas accéder aux attributs en utilisant l'accès au tableau? par exemple $ xml-> OFFICE ['MyAttribute']?
Frank Farmer

si vous voulez utiliser ['@attributes'], vous devez d'abord convertir le SimpleXMLElement en tableau
Enrique

Réponses:


88

Vous pouvez obtenir les attributs d'un élément XML en appelant la fonction attributes () sur un nœud XML. Vous pouvez ensuite var_dump la valeur de retour de la fonction.

Plus d'informations sur php.net http://php.net/simplexmlelement.attributes

Exemple de code de cette page:

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

7
Fait intéressant, $bsera un SimpleXMLElementobjet ainsi print_ret var_dumpvous donnera des choses étranges. Vous pouvez le lancer comme une chaîne (ou ce que vous voulez) pour contourner ce problème.
jxmallett

Faites "". $ B pour le conserver sous forme de chaîne
dr_rk

135

Essaye ça

$xml->attributes()->Token

2
Cela a déjà été répondu par @Artefacto .
hakre

45
Oui, mais sous une forme plus difficile
zysoft

2
Oui, c'est la solution la plus élégante.
Christian

J'ai essayé ceci et je pense que la page plante. Bora ci-dessous semble penser que c'est un format incorrect, avec lequel je suis d'accord pour le moment .. Cependant, j'ai vu ce (votre) format mentionné plusieurs fois. Y a-t-il une nuance qui me manque?
Gerard ONeill

2
@GerardONeill, je ne comprends pas pourquoi Bora dit que c'est une mauvaise façon d'accéder aux attributs, cela fonctionne assez parfaitement. Ce qui vous manque peut-être, c'est que vous devez appeler attributes()l'objet correspondant à la bonne balise dans votre XML. Comme si vous en avez, <root><tag attr="a">b</tag></root>vous devez le faire $xml->tag->attributes()->attrpour y accéder.
zysoft du

55

J'ai utilisé avant tant de fois pour obtenir @attributescomme ci-dessous et c'était un peu plus long.

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

Cela devrait être plus simple et vous ne pouvez obtenir les attributs suivant le format qu'à la fois:

Méthode standard - Attributs d'accès au tableau (AAA)

$xml['field'];

D'autres alternatives sont:

Format droit et rapide

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

Mauvais formats

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

1
Je suis d'accord avec votre premier de vos mauvais formats car je reçois un plantage de page - cependant plusieurs personnes prétendent que cela fonctionne. Une explication ou une nuance à ce sujet?
Gerard ONeill

1
Les "mauvais formats" fonctionnent. J'utilise toujours le premier exemple. Pourquoi est-ce mal?
Grzegorz du

3
Techniquement, $xml->attributes()->{'field'}, $xml->attributes()->fieldet $f='field'; $xml->attributes()->$f;sont les mêmes. Ne voyez aucune raison pour laquelle l'un est un bon format et un autre est faux.
zysoft du

$ xml-> attributes () -> {'field'} est correct car il est sûr à utiliser avec des caractères spéciaux dans le nom d'attribut (c'est-à-dire "data-attr"). $ xml-> attributes () -> field ne fonctionne que pour les attributs qui sont des mots alphanumériques simples
vzr

Obtenir SimpleXMLElement lors de l'utilisation des deux options correctes.
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"]

Utilisez SimpleXMLElement::attributes.

La vérité est que le get_propertiesgestionnaire SimpleXMLElement est très important. Il n'y a pas de propriété nommée "@attributes", vous ne pouvez donc pas le faire $sxml->elem->{"@attributes"}["attrib"].


Merci d'avoir expliqué pourquoi SimpleXML se comporte de cette manière bizarre (le get_propertiesgestionnaire). Très intéressant.
andrewtweber

Obtenir SimpleXMLElement en faisant cela au lieu de la valeur
Darius.V


8

Si vous recherchez une liste de ces attributs, XPath sera votre ami

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

3

Cela m'a aidé à convertir le résultat de simplexml_load_file ($ file) en une structure JSON et à le décoder:

$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

Malheureusement, j'ai une version unique (bloquée avec Gentoo pour le moment) de PHP 5.5, et ce que j'ai trouvé, c'est que

 $xml->tagName['attribute']

était la seule solution qui fonctionnait. J'ai essayé toutes les méthodes de Bora ci-dessus, y compris le format «Right & Quick», et elles ont toutes échoué.

Le fait que ce soit le format le plus simple est un plus, mais je n'ai pas aimé penser que j'étais fou d'essayer tous les formats que d'autres disaient fonctionnels.

Njoy pour ce que ça vaut (ai-je mentionné une construction unique?).


Je recommanderais normalement d'utiliser la notation de tableau pour les attributs des attributs dans le même espace de noms de l'élément dont ils font partie. Je dirais que c'est le format le plus simple (tel que vous le créez) pour une raison. accès au tableau avec un attribut key = nommé avec un élément simplexml.
hakre
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.