Saya kira saya agak terlambat ke pesta tetapi saya telah menulis fungsi kecil untuk menyelesaikan tugas ini. Ini juga menangani atribut, konten teks dan bahkan jika beberapa node dengan nama simpul yang sama adalah saudara kandung.
Penafian:
Saya bukan orang asli PHP, jadi mohon lakukan kesalahan sederhana.
function xml2js($xmlnode) {
$root = (func_num_args() > 1 ? false : true);
$jsnode = array();
if (!$root) {
if (count($xmlnode->attributes()) > 0){
$jsnode["$"] = array();
foreach($xmlnode->attributes() as $key => $value)
$jsnode["$"][$key] = (string)$value;
}
$textcontent = trim((string)$xmlnode);
if (count($textcontent) > 0)
$jsnode["_"] = $textcontent;
foreach ($xmlnode->children() as $childxmlnode) {
$childname = $childxmlnode->getName();
if (!array_key_exists($childname, $jsnode))
$jsnode[$childname] = array();
array_push($jsnode[$childname], xml2js($childxmlnode, true));
}
return $jsnode;
} else {
$nodename = $xmlnode->getName();
$jsnode[$nodename] = array();
array_push($jsnode[$nodename], xml2js($xmlnode, true));
return json_encode($jsnode);
}
}
Contoh penggunaan:
$xml = simplexml_load_file("myfile.xml");
echo xml2js($xml);
Input Contoh (myfile.xml):
<family name="Johnson">
<child name="John" age="5">
<toy status="old">Trooper</toy>
<toy status="old">Ultrablock</toy>
<toy status="new">Bike</toy>
</child>
</family>
Contoh output:
{"family":[{"$":{"name":"Johnson"},"child":[{"$":{"name":"John","age":"5"},"toy":[{"$":{"status":"old"},"_":"Trooper"},{"$":{"status":"old"},"_":"Ultrablock"},{"$":{"status":"new"},"_":"Bike"}]}]}]}
Cukup dicetak:
{
"family" : [{
"$" : {
"name" : "Johnson"
},
"child" : [{
"$" : {
"name" : "John",
"age" : "5"
},
"toy" : [{
"$" : {
"status" : "old"
},
"_" : "Trooper"
}, {
"$" : {
"status" : "old"
},
"_" : "Ultrablock"
}, {
"$" : {
"status" : "new"
},
"_" : "Bike"
}
]
}
]
}
]
}
Yang perlu diingat:
Beberapa tag dengan tagname yang sama dapat berupa saudara kandung. Solusi lain kemungkinan besar akan menjatuhkan semua kecuali saudara terakhir. Untuk menghindari hal ini, setiap simpul tunggal, meskipun hanya memiliki satu anak, adalah larik yang menyimpan objek untuk setiap instance tagname. (Lihat beberapa elemen "" sebagai contoh)
Bahkan elemen root, yang hanya ada satu di dokumen XML yang valid disimpan sebagai array dengan objek instance, hanya untuk memiliki struktur data yang konsisten.
Agar dapat membedakan antara konten simpul XML dan atribut XML, setiap atribut obyek disimpan dalam "$" dan konten pada anak "_".
Sunting:
Saya lupa menampilkan output untuk data input contoh Anda
{
"states" : [{
"state" : [{
"$" : {
"id" : "AL"
},
"name" : [{
"_" : "Alabama"
}
]
}, {
"$" : {
"id" : "AK"
},
"name" : [{
"_" : "Alaska"
}
]
}
]
}
]
}
var_dump
berfungsi dengan baik.)