Zugriff auf @attribute über SimpleXML

120

Ich habe ein Problem beim Zugriff auf den @attributeAbschnitt meines SimpleXML-Objekts. Wenn ich var_dumpdas gesamte Objekt erhalte, erhalte ich die richtige Ausgabe, und wenn ich var_dumpden Rest des Objekts (die verschachtelten Tags) erhalte, erhalte ich die richtige Ausgabe, aber wenn ich den Dokumenten folge und var_dump $xml->OFFICE->{'@attributes'}erhalte, erhalte ich trotzdem ein leeres Objekt Das erste var_dumpzeigt deutlich, dass Attribute ausgegeben werden müssen.

Weiß jemand, was ich hier falsch mache / wie ich das zum Laufen bringen kann?

benjy
quelle
5
var_dump () ist irreführend, wenn es um SimpleXML geht. Nehmen Sie die Ausgabe nicht wörtlich. Können Sie nicht über den Array-Zugriff auf Attribute zugreifen? zB $ xml-> OFFICE ['MyAttribute']?
Frank Farmer
Wenn Sie ['@attributes'] verwenden möchten, müssen Sie das SimpleXMLElement zuerst in ein Array umwandeln
Enrique

Antworten:

88

Sie können die Attribute eines XML-Elements abrufen, indem Sie die Funktion attribute () auf einem XML-Knoten aufrufen. Sie können dann den Rückgabewert der Funktion var_dump.

Weitere Informationen unter php.net http://php.net/simplexmlelement.attributes

Beispielcode von dieser Seite:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
Niels Bom
quelle
7
Interessanterweise $bwird so ein SimpleXMLElementObjekt sein print_rund var_dumpdir seltsame Dinge geben. Sie können es als Zeichenfolge (oder was auch immer Sie möchten) umwandeln, um dies zu umgehen.
jxmallett
Tun Sie "". $ B, um es als Zeichenfolge zu behalten
dr_rk
135

Versuche dies

$xml->attributes()->Token
zysoft
quelle
2
Dies wurde bereits von @Artefacto beantwortet .
hakre
45
Ja, aber in einer schwierigeren Form
zysoft
2
Ja, das ist die eleganteste Lösung.
Christian
Ich habe es versucht und ich denke, die Seite stürzt ab. Bora unten scheint zu denken, dass dies ein falsches Format ist, dem ich im Moment zustimme. Allerdings habe ich dieses (Ihr) Format mehrfach erwähnt. Gibt es eine Nuance, die mir fehlt?
Gerard ONeill
2
@GerardONeill, ich verstehe nicht, warum Bora sagt, dass es falsch ist, auf die Attribute zuzugreifen, es funktioniert ziemlich perfekt. Was Ihnen möglicherweise fehlt, ist, dass Sie attributes()das Objekt aufrufen müssen, das dem richtigen Tag in Ihrem XML entspricht. Wie wenn Sie <root><tag attr="a">b</tag></root>dann haben, müssen Sie tun, $xml->tag->attributes()->attrum darauf zuzugreifen.
Zysoft
54

Ich habe es schon so oft benutzt, um @attributeswie unten zu werden, und es war ein bisschen länger.

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

Es sollte einfacher sein und Sie können Attribute im folgenden Format nur sofort erhalten:

Standardmethode - Array-Zugriffsattribute (AAA)

$xml['field'];

Andere Alternativen sind:

Richtiges und schnelles Format

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

Falsche Formate

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];
Bora
quelle
1
Ich stimme Ihrem ersten Ihrer falschen Formate zu, weil ich einen Seitenabsturz bekomme - jedoch behaupten mehrere Leute, dass dies funktioniert. Irgendeine Erklärung oder Nuance dazu?
Gerard ONeill
1
"Falsche Formate" funktionieren. Ich benutze immer das erste Beispiel. Warum ist es falsch?
Grzegorz
3
Technisch gesehen $xml->attributes()->{'field'}, $xml->attributes()->fieldund $f='field'; $xml->attributes()->$f;sind gleich. Sehen Sie keinen Grund, warum eines ein richtiges Format und ein anderes falsch ist.
Zysoft
$ xml-> attribute () -> {'field'} ist korrekt, da die Verwendung mit Sonderzeichen im Attributnamen (dh "data-attr") sicher ist. $ xml-> Attribute () -> Feld funktioniert nur für Attribute, die einzelne alphanumerische Wörter sind
vzr
Erhalten von SimpleXMLElement, wenn beide richtigen Optionen verwendet werden.
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"]

Verwenden Sie SimpleXMLElement::attributes.

Die Wahrheit ist, dass der SimpleXMLElement- get_propertiesHandler eine große Rolle spielt . Es gibt keine Eigenschaft mit dem Namen "@attributes", Sie können dies also nicht tun $sxml->elem->{"@attributes"}["attrib"].

Artefakt
quelle
Vielen Dank, dass Sie erklärt haben, warum sich SimpleXML so bizarr verhält (der get_propertiesHandler). Sehr interessant.
Andrewwweber
Holen Sie sich SimpleXMLElement, wenn Sie dies anstelle von Wert tun
Darius.V
15

Sie können einfach tun:

echo $xml['token'];
Alix Axel
quelle
8

Wenn Sie jedoch nach einer Liste dieser Attribute suchen, ist XPath Ihr Freund

print_r($xml->xpath('@token'));
Cory Collier
quelle
3

Es hat mir geholfen, das Ergebnis von simplexml_load_file ($ file) in eine JSON-Struktur zu konvertieren und zurück zu dekodieren:

$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
)
t2m
quelle
2

Leider habe ich einen einzigartigen Build (der momentan bei Gentoo steckt) von PHP 5.5, und was ich gefunden habe, war das

 $xml->tagName['attribute']

war die einzige Lösung, die funktionierte. Ich habe alle oben genannten Methoden von Bora ausprobiert, einschließlich des 'Right & Quick'-Formats, und alle sind fehlgeschlagen.

Die Tatsache, dass dies das einfachste Format ist, ist ein Plus, aber ich habe nicht gerne gedacht, dass ich verrückt bin, wenn ich alle Formate ausprobiert habe, von denen andere sagten, dass sie funktionieren.

Njoy für was es wert ist (habe ich einen einzigartigen Build erwähnt?).

Gerard ONeill
quelle
Normalerweise würde ich empfehlen, die Array-Notation für Attribute für die Attribute im selben Namespace des Elements zu verwenden, zu dem sie gehören. Ich würde sagen, es ist aus einem bestimmten Grund das einfachste Format (wie Sie es prägen). Array-Zugriff mit einem benannten key = Attribut mit simplexml-Element.
hakre