Tôi đoán tôi đến bữa tiệc hơi muộn nhưng tôi đã viết một chức năng nhỏ để hoàn thành nhiệm vụ này. Nó cũng quan tâm đến các thuộc tính, nội dung văn bản và ngay cả khi nhiều nút có cùng tên nút là anh em ruột.
Từ chối trách nhiệm:
Tôi không phải là người bản địa PHP, vì vậy xin vui lòng chịu những lỗi đơn giản.
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);
}
}
Ví dụ sử dụng:
$xml = simplexml_load_file("myfile.xml");
echo xml2js($xml);
Ví dụ đầu vào (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>
Ví dụ đầu ra:
{"family":[{"$":{"name":"Johnson"},"child":[{"$":{"name":"John","age":"5"},"toy":[{"$":{"status":"old"},"_":"Trooper"},{"$":{"status":"old"},"_":"Ultrablock"},{"$":{"status":"new"},"_":"Bike"}]}]}]}
In đẹp:
{
"family" : [{
"$" : {
"name" : "Johnson"
},
"child" : [{
"$" : {
"name" : "John",
"age" : "5"
},
"toy" : [{
"$" : {
"status" : "old"
},
"_" : "Trooper"
}, {
"$" : {
"status" : "old"
},
"_" : "Ultrablock"
}, {
"$" : {
"status" : "new"
},
"_" : "Bike"
}
]
}
]
}
]
}
Những điều cần lưu ý:
Một số thẻ có cùng tên thẻ có thể là anh em ruột. Các giải pháp khác rất có thể sẽ bỏ tất cả trừ anh chị em cuối cùng. Để tránh điều này, mỗi nút đơn lẻ, ngay cả khi nó chỉ có một con, là một mảng chứa một đối tượng cho mỗi phiên bản của tên thẻ. (Xem nhiều yếu tố "" trong ví dụ)
Ngay cả phần tử gốc, trong đó chỉ có một phần tử tồn tại trong tài liệu XML hợp lệ được lưu trữ dưới dạng mảng với một đối tượng của thể hiện, chỉ để có cấu trúc dữ liệu nhất quán.
Để có thể phân biệt giữa nội dung nút XML và các thuộc tính XML, mỗi thuộc tính đối tượng được lưu trữ trong "$" và nội dung trong phần tử con "_".
Chỉnh sửa:
Tôi quên hiển thị đầu ra cho dữ liệu đầu vào mẫu của bạn
{
"states" : [{
"state" : [{
"$" : {
"id" : "AL"
},
"name" : [{
"_" : "Alabama"
}
]
}, {
"$" : {
"id" : "AK"
},
"name" : [{
"_" : "Alaska"
}
]
}
]
}
]
}
var_dump
hoạt động tốt.)