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?


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";
}

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

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'];

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"].


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


8

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

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

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
)

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?).


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.