1.从文件获取json数据
$json = file_get_contents("./test.json");
2.转化json内容为对象,这里注意转为object而不是array
$data = @json_decode($json, false);
if (!is_array($data) && !is_object($data)) {
echo 'ERROR: Invalid JSON given' . PHP_EOL;
exit(1);
}
3.php获取xml初始模板或者自己可以自定义子节点,我这里使用的是我这边的初始模板;
<Configuration >
<Primitives>
</Primitives>
</Configuration>
4.通过php的DOMDocument
$doc = new \DOMDocument('1.0', 'utf-8');
$doc->load("test.xml");
$configuration = $doc->getElementsByTagName("Configuration");
$Primitives = $doc->getElementsByTagName("Primitives");
$primitives = $Primitives->item(0);
$components = $data->Configuration->components;
for ($i=0; $i < count($components); $i++) {
$primitiveName = $components[$i]->primitiveName;
$primit = $doc->createElement($primitiveName);
$primits = parseXml($primit,$components[$i],$doc,"Primitives");
$primitives->appendChild($primits);
}
$doc->encoding = 'utf-8';
$doc->save("test.xml");
5.通过递归调用解析函数进行xml节点的创建与添加
function parseXml($parentNode,$data,$doc,$parentname){
if(is_object($data)){
foreach ($data as $key => $value) {
if(is_object($value)){
$node = $doc->createElement($key);
$nodes = parseXml($node,$value,$doc,$parentname);
$parentNode->appendChild($nodes);
}else if(is_array($value)){
foreach ($value as $item) {
$node = $doc->createElement($key);
$nodes = parseXml($node,$item,$doc,$parentname);
$parentNode->appendChild($nodes);
}
}else{
$parentNode->setAttribute($key,$value);
}
}
}
return $parentNode;
}
6.程序调用
exportXml($data);
示例:test.json
{
"Configuration": {
"name": "Sample",
"width": "780",
"height": "560",
"backgroundColor": "1859501",
"xmlns": "http://www.realtimes.com.cn/2012",
"components": [{
"identifier": "e3605313-1716-4dd5-8f0f-59f05d22890d",
"Device": {
"id": "18100098",
"name": "环境量"
},
"Signals": {
"Signal": [{
"id": "81160000",
"name": "DI1状态"
}, {
"id": "81160001",
"name": "DI2状态"
}, {
"id": "81160002",
"name": "DI3状态"
}, {
"id": "81160003",
"name": "DI4状态"
}]
},
"lines": {
"line": [{
"type": "point",
"point1": "-85.35,-35.36,0",
"point2": "-50,0,0",
"point3": "85.35,-35.36,0"
}, {
"type": "face",
"point1": "-85.35,-35.36,0",
"point2": "-50,0,0",
"point3": "85.35,-35.36,0"
}]
},
"linetype": "off",
"Controls": "",
"power": "",
"windtype": {
"name": "wind1",
"names": "空调进风,机柜出风"
},
"name": "ZhuTiKuangJia0",
"names": "主体框架1",
"parentobj": "",
"primitiveName": "ZhuTiKuangJia",
"x": "-368.5",
"type": "weimokuai",
"y": "0",
"z": "159",
"width": "735.0000000000001",
"height": "318",
"depth": "232",
"scaleX": "1.1187214611872147",
"scaleY": "1",
"scaleZ": "1.06",
"rotation": "0",
"ratio": "1",
"toolTip": "",
"url": "",
"isShowTextPanel": "false",
"textPanelTitle": "",
"textPanelWidth": "64",
"textPanelHeight": "64",
"textPanelUnit": "",
"textPanelFontSize": "20",
"textPanelFontColor": "16777215",
"textPanelColor": "5419875"
}]
}
}
转化后的test.xml:
<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="http://www.realtimes.com.cn/2012" name="Sample" width="780" height="560" backgroundColor="1859501">
<Primitives>
<ZhuTiKuangJia identifier="e3605313-1716-4dd5-8f0f-59f05d22890d" linetype="off" Controls="" power="" name="ZhuTiKuangJia0" names="主体框架1" parentobj="" primitiveName="ZhuTiKuangJia" x="-368.5" type="weimokuai" y="0" z="159" width="735.0000000000001" height="318" depth="232" scaleX="1.1187214611872147" scaleY="1" scaleZ="1.06" rotation="0" ratio="1" toolTip="" url="" isShowTextPanel="false" textPanelTitle="" textPanelWidth="64" textPanelHeight="64" textPanelUnit="" textPanelFontSize="20" textPanelFontColor="16777215" textPanelColor="5419875">
<Device id="18100098" name="环境量"/>
<Signals>
<Signal id="81160000" name="DI1状态"/>
<Signal id="81160001" name="DI2状态"/>
<Signal id="81160002" name="DI3状态"/>
<Signal id="81160003" name="DI4状态"/>
</Signals>
<lines>
<line type="point" point1="-85.35,-35.36,0" point2="-50,0,0" point3="85.35,-35.36,0"/>
<line type="face" point1="-85.35,-35.36,0" point2="-50,0,0" point3="85.35,-35.36,0"/>
</lines>
<windtype name="wind1" names="空调进风,机柜出风"/>
</ZhuTiKuangJia>
</Primitives>
</Configuration>
有什么更好的程序,交个朋友,大家一起沟通学习!
原创不易,还望珍惜!