Sanırım partiye biraz geç kaldım ama bu görevi yerine getirmek için küçük bir işlev yazdım. Ayrıca öznitelikler, metin içeriği ve aynı düğüm adına sahip birden fazla düğüm kardeş olsa bile ilgilenir.
Yasal Uyarı:
Ben bir PHP yerli değilim, bu yüzden lütfen basit hatalar ile ayı.
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);
}
}
Kullanım örneği:
$xml = simplexml_load_file("myfile.xml");
echo xml2js($xml);
Örnek Giriş (dosyam.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>
Örnek çıktı:
{"family":[{"$":{"name":"Johnson"},"child":[{"$":{"name":"John","age":"5"},"toy":[{"$":{"status":"old"},"_":"Trooper"},{"$":{"status":"old"},"_":"Ultrablock"},{"$":{"status":"new"},"_":"Bike"}]}]}]}
Oldukça basılmış:
{
"family" : [{
"$" : {
"name" : "Johnson"
},
"child" : [{
"$" : {
"name" : "John",
"age" : "5"
},
"toy" : [{
"$" : {
"status" : "old"
},
"_" : "Trooper"
}, {
"$" : {
"status" : "old"
},
"_" : "Ultrablock"
}, {
"$" : {
"status" : "new"
},
"_" : "Bike"
}
]
}
]
}
]
}
Akılda tutulması
gereken tuhaflıklar : Aynı tagname'e sahip birkaç etiket kardeş olabilir. Diğer çözümler büyük olasılıkla son kardeş dışında hepsini bırakacaktır. Bundan kaçınmak için, her bir düğüm, yalnızca bir alt öğesi olsa bile, tagname'in her örneği için bir nesne tutan bir dizidir. (Örnekte birden çok "" öğesine bakın)
Geçerli bir XML belgesinde yalnızca birinin bulunması gereken kök öğe bile, yalnızca tutarlı bir veri yapısına sahip olmak için örneğin bir nesnesiyle dizi olarak saklanır.
XML düğümü içeriği ile XML özniteliklerini ayırt edebilmek için, her nesne özniteliği "$" ve "_" alt öğesindeki içerik olarak depolanır.
Düzenleme:
Örnek giriş verileriniz için çıktıyı göstermeyi unuttum
{
"states" : [{
"state" : [{
"$" : {
"id" : "AL"
},
"name" : [{
"_" : "Alabama"
}
]
}, {
"$" : {
"id" : "AK"
},
"name" : [{
"_" : "Alaska"
}
]
}
]
}
]
}
var_dump