ฉันคิดว่าฉันมาช้าไปงานปาร์ตี้ แต่ฉันได้เขียนฟังก์ชั่นเล็ก ๆ เพื่อให้งานนี้สำเร็จ นอกจากนี้ยังดูแลแอ็ตทริบิวต์เนื้อหาข้อความและแม้ว่าหลายโหนดที่มีชื่อโหนดเดียวกันจะเป็นพี่น้องกัน
การปฏิเสธความรับผิดชอบ:
ฉันไม่ใช่คนพื้นเมืองของ PHP ดังนั้นโปรดอดทนกับข้อผิดพลาดง่าย ๆ
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);
}
}
ตัวอย่างการใช้งาน:
$xml = simplexml_load_file("myfile.xml");
echo xml2js($xml);
ตัวอย่างอินพุต (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>
ตัวอย่างผลลัพธ์:
{"family":[{"$":{"name":"Johnson"},"child":[{"$":{"name":"John","age":"5"},"toy":[{"$":{"status":"old"},"_":"Trooper"},{"$":{"status":"old"},"_":"Ultrablock"},{"$":{"status":"new"},"_":"Bike"}]}]}]}
พิมพ์สวย:
{
"family" : [{
"$" : {
"name" : "Johnson"
},
"child" : [{
"$" : {
"name" : "John",
"age" : "5"
},
"toy" : [{
"$" : {
"status" : "old"
},
"_" : "Trooper"
}, {
"$" : {
"status" : "old"
},
"_" : "Ultrablock"
}, {
"$" : {
"status" : "new"
},
"_" : "Bike"
}
]
}
]
}
]
}
ข้อควรจำ:
แท็กหลายแท็กที่มีชื่อเดียวกันสามารถเป็นพี่น้องกันได้ โซลูชันอื่น ๆ มักจะทิ้งทั้งหมดยกเว้นพี่น้องคนสุดท้าย เพื่อหลีกเลี่ยงปัญหานี้แต่ละโหนดทุกโหนดแม้ว่าจะมีลูกเพียงคนเดียวก็คืออาร์เรย์ที่มีวัตถุสำหรับแต่ละอินสแตนซ์ของ tagname (ดูตัวอย่างองค์ประกอบหลายรายการ "")
แม้แต่องค์ประกอบรูทซึ่งควรมีอยู่เพียงหนึ่งเดียวเท่านั้นในเอกสาร XML ที่ถูกต้องจะถูกเก็บเป็นอาร์เรย์ที่มีวัตถุของอินสแตนซ์เพียงเพื่อให้มีโครงสร้างข้อมูลที่สอดคล้องกัน
เพื่อให้สามารถแยกความแตกต่างระหว่างเนื้อหาโหนด XML และแอตทริบิวต์ XML แต่ละแอตทริบิวต์ของวัตถุจะถูกเก็บไว้ใน "$" และเนื้อหาใน "_" ลูก
แก้ไข:
ฉันลืมแสดงเอาต์พุตสำหรับข้อมูลอินพุตตัวอย่างของคุณ
{
"states" : [{
"state" : [{
"$" : {
"id" : "AL"
},
"name" : [{
"_" : "Alabama"
}
]
}, {
"$" : {
"id" : "AK"
},
"name" : [{
"_" : "Alaska"
}
]
}
]
}
]
}
var_dump
ทำงานได้ดี)