나는 파티에 조금 늦었다 고 생각하지만이 작업을 수행하기 위해 작은 기능을 작성했습니다. 또한 속성, 텍스트 내용 및 동일한 node-name을 가진 여러 노드가 형제 인 경우에도 처리합니다.
면책 조항 :
저는 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
는 잘 작동합니다.)