php json转化为xml,包括子节点与属性

1 篇文章 0 订阅
1 篇文章 0 订阅

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>

有什么更好的程序,交个朋友,大家一起沟通学习!

原创不易,还望珍惜!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值