Accesso a @attribute da SimpleXML


120

Ho problemi ad accedere alla @attributesezione del mio oggetto SimpleXML. Quando ho var_dumpl'intero oggetto, ottengo l'output corretto e quando ho var_dumpil resto dell'oggetto (i tag nidificati), ottengo l'output corretto, ma quando seguo i documenti e var_dump $xml->OFFICE->{'@attributes'}ottengo un oggetto vuoto, nonostante il fatto che il primo var_dumpmostra chiaramente che ci sono attributi da produrre.

Qualcuno sa cosa sto facendo di sbagliato qui / come posso farlo funzionare?


5
var_dump () è fuorviante, quando si tratta di SimpleXML. Non prendere alla lettera la sua produzione. Inoltre, non puoi accedere agli attributi utilizzando l'accesso agli array? ad es. $ xml-> OFFICE ['MyAttribute']?
Frank Farmer,

se vuoi usare ['@attributes'] devi prima lanciare SimpleXMLElement all'array
Enrique,

Risposte:


88

È possibile ottenere gli attributi di un elemento XML chiamando la funzione attributes () su un nodo XML. È quindi possibile var_dump il valore restituito dalla funzione.

Maggiori informazioni su php.net http://php.net/simplexmlelement.attributes

Codice di esempio da quella pagina:

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

7
È interessante notare $bche sarà un SimpleXMLElementoggetto così print_re var_dumpti darà cose strane. Puoi lanciarlo come una stringa (o come preferisci) per aggirare questo problema.
jxmallett

Fai "". $ B per mantenerlo come una stringa
dr_rk

135

Prova questo

$xml->attributes()->Token

2
Questo ha già ricevuto risposta da @Artefacto .
hakre

45
Sì, ma in una forma più difficile
zysoft,

2
Sì, questa è la soluzione più elegante.
Christian

L'ho provato e penso che la pagina si blocchi. Bora sotto sembra pensare che questo sia un formato sbagliato, con cui sono d'accordo in questo momento .. Tuttavia ho visto questo (tuo) formato menzionato più volte. C'è qualche sfumatura che mi manca?
Gerard ONeill

2
@ GerardONeill, non capisco perché Bora dice che è un modo sbagliato di accedere agli attributi, funziona perfettamente. Quello che potresti perdere è che devi chiamare attributes()l'oggetto corrispondente al tag giusto nel tuo XML. Ad esempio, se lo hai, <root><tag attr="a">b</tag></root>devi farlo $xml->tag->attributes()->attrper accedervi.
zysoft

55

L'ho usato prima così tante volte per ottenere @attributescome di seguito ed è stato un po 'più lungo.

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

Dovrebbe essere più semplice e puoi ottenere attributi nel seguente formato solo in una volta:

Modalità standard - Attributi di accesso agli array (AAA)

$xml['field'];

Altre alternative sono:

Formato corretto e veloce

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

Formati sbagliati

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

1
Sono d'accordo con il tuo primo dei formati sbagliati perché sto ricevendo un arresto anomalo della pagina, tuttavia più persone affermano che funziona. Qualche spiegazione o sfumatura su questo?
Gerard ONeill

1
"Formati sbagliati" funzionano. Uso sempre il primo esempio. Perché è sbagliato?
Grzegorz

3
Tecnicamente, $xml->attributes()->{'field'}, $xml->attributes()->field, e $f='field'; $xml->attributes()->$f;sono gli stessi. Non vedo motivo per cui uno è nel formato giusto e un altro è sbagliato.
zysoft

$ xml-> attributes () -> {'field'} è corretto perché è sicuro da usare con caratteri speciali nel nome dell'attributo (ad esempio "data-attr"). $ xml-> attributes () -> field funziona solo per attributi che sono singole parole alfanumeriche
vzr

Ottenere SimpleXMLElement quando si utilizzano entrambe le opzioni corrette.
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"]

Usa SimpleXMLElement::attributes.

La verità è che il get_propertiesgestore SimpleXMLElement giace alla grande. Non esiste una proprietà denominata "@attributes", quindi non puoi farlo $sxml->elem->{"@attributes"}["attrib"].


Grazie per aver spiegato perché SimpleXML si comporta in questo modo bizzarro (il get_propertiesgestore). Molto interessante.
andrewtweber

Ottenere SimpleXMLElement quando si esegue questa operazione al posto del valore
Darius.V


8

Se stai cercando un elenco di questi attributi, XPath sarà tuo amico

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

3

Mi ha aiutato a convertire il risultato di simplexml_load_file ($ file) in una struttura JSON e a decodificarlo di nuovo:

$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

Sfortunatamente ho una build unica (bloccata con Gentoo per il momento) di PHP 5.5, e quello che ho trovato è che

 $xml->tagName['attribute']

era l'unica soluzione che ha funzionato. Ho provato tutti i metodi di Bora sopra, incluso il formato "Right & Quick", e tutti hanno fallito.

Il fatto che questo sia il formato più semplice è un vantaggio, ma non mi è piaciuto pensare che ero pazzo a provare tutti i formati che altri dicevano funzionavano.

Njoy per quello che vale (ho menzionato una build unica?).


Normalmente consiglierei di utilizzare la notazione array per gli attributi per gli attributi nello stesso spazio dei nomi dell'elemento di cui fanno parte. Direi che è il formato più semplice (come lo si conia) per un motivo. accesso ad array con un attributo key = denominato con elemento simplexml.
hakre
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.