Dostęp do @attribute z SimpleXML

120

Mam problem z dostępem do @attributesekcji mojego obiektu SimpleXML. Kiedy mam var_dumpcały obiekt, otrzymuję prawidłowe dane wyjściowe, a kiedy mam var_dumpresztę obiektu (zagnieżdżone tagi), otrzymuję poprawne dane wyjściowe, ale kiedy śledzę dokumenty i var_dump $xml->OFFICE->{'@attributes'}otrzymuję pusty obiekt, pomimo faktu, że pierwsza var_dumpwyraźnie pokazuje, że istnieją atrybuty do wyprowadzenia.

Czy ktoś wie, co tu robię źle / jak mogę to zrobić?

benjy
źródło
5
var_dump () wprowadza w błąd, jeśli chodzi o SimpleXML. Nie bierz wyników dosłownie. Czy nie możesz uzyskać dostępu do atrybutów za pomocą dostępu do tablicy? np. $ xml-> OFFICE ['MyAttribute']?
Frank Farmer
jeśli chcesz użyć [„@attributes”], musisz najpierw rzutować element SimpleXMLElement na tablicę
Enrique

Odpowiedzi:

88

Atrybuty elementu XML można uzyskać, wywołując funkcję attribute () w węźle XML. Następnie możesz var_dump wartość zwracaną przez funkcję.

Więcej informacji na php.net http://php.net/simplexmlelement.attributes

Przykładowy kod z tej strony:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
Niels Bom
źródło
7
Co ciekawe, $bbędzie taki SimpleXMLElementobiekt print_ri var_dumpda Ci dziwne rzeczy. Możesz rzucić go jako sznur (lub cokolwiek chcesz), aby to obejść.
jxmallett
Zrób „”. $ B, aby zachować to jako ciąg
dr_rk
135

Spróbuj tego

$xml->attributes()->Token
zysoft
źródło
2
Na to odpowiedział już @Artefacto .
hakre
45
Tak, ale w cięższej formie
zysoft
2
Tak, to najbardziej eleganckie rozwiązanie.
Christian
Próbowałem tego i wydaje mi się, że strona się zawiesza. Bora poniżej wydaje się uważać, że to zły format, z którym w tej chwili się zgadzam .. Jednak widziałem ten (twój) format wspominany wiele razy. Czy brakuje mi jakichś niuansów?
Gerard ONeill
2
@GerardONeill, nie rozumiem, dlaczego Bora mówi, że to zły sposób uzyskiwania dostępu do atrybutów, działa całkiem idealnie. To, czego może ci brakować, to to, że musisz wywołać attributes()obiekt odpowiadający właściwemu tagowi w twoim XML. Na przykład, jeśli masz <root><tag attr="a">b</tag></root>, musisz zrobić, $xml->tag->attributes()->attraby uzyskać do niego dostęp.
zysoft
55

Używałem wcześniej tyle razy, żeby dostać się @attributesjak poniżej i trwało to trochę dłużej.

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

Powinno być łatwiejsze i możesz uzyskać atrybuty w następującym formacie tylko na raz:

Standardowy sposób - atrybuty dostępu do tablicy (AAA)

$xml['field'];

Inne alternatywy to:

Właściwe i szybkie formatowanie

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

Niewłaściwe formaty

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];
Bora
źródło
1
Zgadzam się z pierwszym z niewłaściwych formatów, ponieważ pojawia się awaria strony - jednak wiele osób twierdzi, że działa. Jakieś wyjaśnienie lub niuanse na ten temat?
Gerard ONeill
1
„Niewłaściwe formaty” działają. Zawsze używam pierwszego przykładu. Dlaczego jest źle?
Grzegorz
3
Technicznie $xml->attributes()->{'field'}, $xml->attributes()->fieldi $f='field'; $xml->attributes()->$f;są takie same. Nie widzę powodu, dla którego jeden jest właściwym formatem, a inny jest zły.
zysoft
$ xml-> attribute () -> {'field'} jest poprawne, ponieważ można go bezpiecznie używać ze znakami specjalnymi w nazwie atrybutu (np. „data-attr”). $ xml-> attributes () -> pole działa tylko dla atrybutów, które są pojedynczymi słowami alfanumerycznymi
vzr
Uzyskiwanie SimpleXMLElement przy użyciu obu poprawnych opcji.
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"]

Użyj SimpleXMLElement::attributes.

Prawda jest taka, że get_propertiesprogram obsługi SimpleXMLElement leży bardzo długo. Nie ma właściwości o nazwie „@attributes”, więc nie możesz tego zrobić $sxml->elem->{"@attributes"}["attrib"].

Artefacto
źródło
Dziękuję za wyjaśnienie, dlaczego SimpleXML zachowuje się w ten dziwny sposób (program get_propertiesobsługi). Bardzo interesujące.
andrewtweber
Uzyskiwanie SimpleXMLElement podczas robienia tego zamiast wartości
Darius.V
15

Możesz po prostu:

echo $xml['token'];
Alix Axel
źródło
8

Jeśli jednak szukasz listy tych atrybutów, XPath będzie Twoim przyjacielem

print_r($xml->xpath('@token'));
Cory Collier
źródło
3

Pomogło mi to przekonwertować wynik simplexml_load_file ($ file) na strukturę JSON i zdekodować go z powrotem:

$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
źródło
2

Niestety mam unikalną kompilację (na razie utknąłem w Gentoo) PHP 5.5 i znalazłem to

 $xml->tagName['attribute']

było jedynym rozwiązaniem, które zadziałało. Wypróbowałem wszystkie powyższe metody Bora, w tym format „Right & Quick” i wszystkie zawiodły.

Fakt, że jest to najłatwiejszy format, jest plusem, ale nie podobało mi się myślenie, że oszalałem, próbując wszystkich formatów, o których inni mówili, że działają.

Ciesz się, za ile jest wart (czy wspomniałem o wyjątkowej konstrukcji?).

Gerard ONeill
źródło
Normalnie zalecałbym użycie notacji tablicowej dla atrybutów dla atrybutów w tej samej przestrzeni nazw elementu, którego część. Powiedziałbym, że jest to najłatwiejszy format (jak go ubijasz) z jakiegoś powodu. dostęp do tablicy z nazwanym atrybutem key = z elementem simplexml.
hakre