PHP完美json或数组转XML(原创)


网上看到那些都是垃圾,数组多几层就不行了,还有就是用字符串组合成xml结构,这样很容易出错。
本人原创的这段是用PHP的DOMDocument生成的xml结构,兼容性很好,而且解析时不会出错。


class jsonToXml {

	public static function convert($data, DOMDocument $dom = null, DOMElement $xml = null) {
		if(!$dom) {
			$dom = new DOMDocument('1.0', 'UTF-8');
			$dom->formatOutput = true;
		}
		if(!$xml) {
			$xml = $dom->createElement('xml');
			$xml->setAttribute('root', 'http://www.ghostwei.com'); //设置一些属性
			$dom->appendChild($xml);
		}
		foreach($data As $key => $val) {
			$key = !is_string($key) ? $xml->tagName : $key;
			if(is_array($val) && count($val) && preg_match('/^[\d]+$/', implode('', array_keys($val)))) {
				foreach($val As $k => $v) {
					$e = $dom->createElement($key);
					$xml->appendChild($e);

					if(is_object($v) || is_array($v)) {
						self::convert($v, $dom, $e);
						continue;
					}
					if(is_string($v) && preg_match('/<[^>]+>/', $v)) {
						$e->appendChild($dom->createCDATASection($v));
					} else {
						$e->nodeValue = htmlspecialchars((string) $v);
					}
				}
				continue;
			}
			if((is_object($val) || is_array($val)) && count($val)) {
				$e = $dom->createElement($key);
				$xml->appendChild($e);
				self::convert($val, $dom, $e);
				continue;
			}
			if((is_object($val) || is_array($val)) && !count($val)) {
				$xml->appendChild($dom->createElement($key));
				continue;
			}
			$e = $dom->createElement($key);
			$xml->appendChild($e);
			if(is_string($val) && preg_match('/<[^>]+>/', $val)) {
				$e->appendChild($dom->createCDATASection($val));
			} else {
				$e->nodeValue = htmlspecialchars((string) $val);
			}
		}
		return $dom->saveXML();
	}

}



实例应用:

header('Content-Type:text/xml; charset=utf-8');
echo jsonToXml::convert($json);



JSON数据:
stdClass Object
(
    [com] => ghostwei
    [nu] => 61693388
    [message] => ok
    [status] => 1
    [state] => 1
    [data] => Array
        (
            [0] => stdClass Object
                (
                    [time] => 2016-11-07 11:40:41
                    [context] => 包裹已揽收
                )

            [1] => stdClass Object
                (
                    [time] => 2016-11-07 11:46:10
                    [context] => Parcel Departure Scan
                )

            [2] => stdClass Object
                (
                    [time] => 2016-12-13 12:42:49
                    [context] => 包裹已到达 Markham(ON) 转运中心
                )

            [3] => stdClass Object
                (
                    [time] => 2016-12-13 12:57:24
                    [context] => 包裹已到达 Markham(ON) 转运中心
                )

            [4] => stdClass Object
                (
                    [time] => 2016-12-13 13:04:08
                    [context] => 包裹已取消发货,返回收货点,原因:test
                )

        )

)



效果:


去年1月19日 阅读:95 评论:1

青锋幽灵

゛. - 看過世间最冷漠滴眼神,  爱過⒈生最无缘滴人﹎ 岳麓区中南大学西大门,后湖安置小区17栋(902路公交和立珊专线的终点站,与阳光100小区比邻)

评论 More..
unknown

不错

回复 去年7月8日 175.0.30.164


登录 注册

您没有登录,如果还不是会员请先注册

文明上网,理性发帖!


顶部