Mengakses @attribute dari SimpleXML

120

Saya mengalami masalah saat mengakses @attributebagian dari objek SimpleXML saya. Ketika saya var_dumpseluruh objek, saya mendapatkan output yang benar, dan ketika saya var_dumpsisa objek (tag bersarang), saya mendapatkan output yang benar, tetapi ketika saya mengikuti dokumen dan var_dump $xml->OFFICE->{'@attributes'}, saya mendapatkan objek kosong, terlepas dari kenyataan bahwa yang pertama var_dumpdengan jelas menunjukkan bahwa ada atribut ke keluaran.

Adakah yang tahu apa yang saya lakukan salah di sini / bagaimana saya bisa membuat ini berhasil?

benjy
sumber
5
var_dump () menyesatkan, jika berhubungan dengan SimpleXML. Jangan mengartikan hasilnya secara harfiah. Juga, tidak bisakah Anda mengakses atribut menggunakan akses array? misalnya $ xml-> KANTOR ['MyAttribute']?
Frank Farmer
jika Anda ingin menggunakan ['@attributes'], Anda perlu mentransmisikan SimpleXMLElement ke array terlebih dahulu
Enrique

Jawaban:

88

Anda bisa mendapatkan atribut elemen XML dengan memanggil fungsi atribut () pada node XML. Anda kemudian dapat melakukan var_dump nilai hasil dari fungsi tersebut.

Info lebih lanjut di php.net http://php.net/simplexmlelement.attributes

Kode contoh dari halaman itu:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
Niels Bom
sumber
7
Menariknya, $bakan jadi SimpleXMLElementbenda jadi print_rdan var_dumpakan memberimu hal-hal aneh. Anda dapat memasukkannya sebagai string (atau apa pun yang Anda suka) untuk menyiasati ini.
jxmallett
Lakukan "". $ B untuk menyimpannya sebagai string
dr_rk
135

Coba ini

$xml->attributes()->Token
zysoft
sumber
2
Ini sudah dijawab oleh @Artefacto .
hakre
45
Ya, tetapi dalam bentuk yang lebih sulit
zysoft
2
Ya, ini solusi paling elegan.
Christian
Saya sudah mencoba ini, dan menurut saya halamannya rusak. Bora di bawah sepertinya menganggap ini adalah format yang salah, yang saya setujui saat ini .. Namun saya telah melihat format (Anda) ini disebutkan beberapa kali. Apakah ada nuansa yang saya lewatkan?
Gerard ONeill
2
@GerardONeill, Saya tidak mengerti mengapa Bora mengatakan itu cara yang salah dalam mengakses atribut, itu berfungsi dengan cukup sempurna. Apa yang mungkin Anda lewatkan adalah Anda perlu memanggil attributes()objek yang sesuai dengan tag yang tepat di XML Anda. Seperti jika sudah <root><tag attr="a">b</tag></root>maka yang perlu Anda lakukan $xml->tag->attributes()->attruntuk mengaksesnya.
zysoft
55

Saya menggunakan sebelumnya berkali-kali untuk mendapatkan @attributesseperti di bawah dan itu sedikit lebih lama.

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

Seharusnya lebih mudah dan Anda bisa mendapatkan atribut yang mengikuti format hanya sekaligus:

Cara Standar - Atribut Akses Array (AAA)

$xml['field'];

Alternatif lainnya adalah:

Format Kanan & Cepat

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

Format Salah

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];
Bora
sumber
1
Saya setuju dengan format pertama Anda yang salah karena saya mengalami halaman mogok - namun beberapa orang mengklaim ini berfungsi. Ada penjelasan atau nuansa tentang ini?
Gerard ONeill
1
"Format salah" berfungsi. Saya selalu menggunakan contoh pertama. Kenapa salah
Grzegorz
3
Secara teknis, $xml->attributes()->{'field'}, $xml->attributes()->field, dan $f='field'; $xml->attributes()->$f;adalah sama. Tidak melihat alasan mengapa satu format yang benar dan yang lainnya salah.
zysoft
$ xml-> atribut () -> {'field'} benar karena aman digunakan dengan karakter khusus dalam nama atribut (yaitu "data-attr"). $ xml-> atribut () -> bidang hanya berfungsi untuk atribut yang merupakan kata alfanumerik tunggal
vzr
Mendapatkan SimpleXMLElement saat menggunakan kedua opsi yang benar.
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"]

Gunakan SimpleXMLElement::attributes.

Sebenarnya, get_propertieshandler SimpleXMLElement berbohong banyak waktu. Tidak ada properti bernama "@attributes", jadi Anda tidak bisa melakukannya $sxml->elem->{"@attributes"}["attrib"].

Artefacto
sumber
Terima kasih telah menjelaskan mengapa SimpleXML berperilaku aneh ini ( get_propertiespenangan). Sangat menarik.
andrewtweber
Mendapatkan SimpleXMLElement saat melakukan ini alih-alih nilai
Darius.V
15

Anda bisa melakukan:

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

Jika Anda mencari daftar atribut ini, XPath akan menjadi teman Anda

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

Ini membantu saya mengonversi hasil simplexml_load_file ($ file) menjadi Struktur JSON dan mendekodekannya kembali:

$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
sumber
2

Sayangnya saya memiliki build yang unik (saat ini tidak menggunakan Gentoo) PHP 5.5, dan yang saya temukan adalah itu

 $xml->tagName['attribute']

adalah satu-satunya solusi yang berhasil. Saya mencoba semua metode Bora di atas, termasuk format 'Right & Quick', dan semuanya gagal.

Fakta bahwa ini adalah format termudah adalah nilai tambah, tetapi tidak senang berpikir saya gila mencoba semua format yang dikatakan orang lain berfungsi.

Njoy untuk apa nilainya (apakah saya menyebutkan bangunan unik?).

Gerard ONeill
sumber
Saya biasanya akan merekomendasikan untuk menggunakan notasi array untuk atribut untuk atribut dalam namespace yang sama dari elemen bagiannya. Saya akan mengatakan itu format termudah (saat Anda membuat koin) karena suatu alasan. akses-array dengan atribut bernama key = dengan elemen simplexml.
hakre