当前位置:首页 > PHP教程 > php函数 > 列表

PHP数组与XML之间的转换的例子

发布:smiling 来源: PHP粉丝网  添加日期:2016-07-27 13:17:59 浏览: 评论:0 

数组与XML方法有不少如直接使用遍历数组然后生成xml同时也可以使用DOMDocument来生成xml,具体的方法与步骤如下所示。

PHP将数组转换成XML:

PHP可以将数组转换成xml格式,简单的办法是遍历数组,然后将数组的key/value转换成xml节点,再直接echo输出了,如:

  1. function arrayToXml($arr){ 
  2.     $xml = "<root>"
  3.     foreach ($arr as $key=>$val){ 
  4.         if(is_array($val)){ 
  5.             $xml.="<".$key.">".arrayToXml($val)."</".$key.">"
  6.         }else
  7.             $xml.="<".$key.">".$val."</".$key.">"
  8.         } 
  9.     } 
  10.     $xml.="</root>"
  11.     return $xml

我测试了下,这个最简单,速度又快,支持多为数组,中文也不会乱码。

另一种方法是利用DOMDocument来生成xml结构,代码如下:

  1. function arrayToXml($arr,$dom=0,$item=0){ 
  2.     if (!$dom){ 
  3.         $dom = new DOMDocument("1.0"); 
  4.     } 
  5.     if(!$item){ 
  6.         $item = $dom->createElement("root"); 
  7.         $dom->appendChild($item); 
  8.     }  //phpfensi.com 
  9.     foreach ($arr as $key=>$val){ 
  10.         $itemx = $dom->createElement(is_string($key)?$key:"item"); 
  11.         $item->appendChild($itemx); 
  12.         if (!is_array($val)){ 
  13.             $text = $dom->createTextNode($val); 
  14.             $itemx->appendChild($text); 
  15.              
  16.         }else { 
  17.             arrayToXml($val,$dom,$itemx); 
  18.         } 
  19.     } 
  20.     return $dom->saveXML(); 

它同样可以将数组转换成xml,而且支持多维数组,生成的xml中文也不会乱码。

PHP将XML转换成数组:

做接口开发的时候经常会碰到别人提交给你的是xml格式的数据,常见的微信接口、支付宝接口等,他们的接口如发送消息通信都是xml格式的,那么我们先想办法拿到这个xml数据,然后再将其转化成数组。

假设我们获取到一个这样的XML,代码如下:

  1. <root> 
  2. <user>月光光abcd</user> 
  3. <pvs>13002</pvs> 
  4. <ips> 
  5. <baidu_ip>1200</baidu_ip> 
  6. <google_ip>1829</google_ip> 
  7. </ips> 
  8. <date>2016-06-01</date
  9. </root> 

通过simplexml_load_string()解析读取xml数据,然后先转成json格式,再转换成数组,代码如下:

  1. function xmlToArray($xml){     
  2.     //禁止引用外部xml实体 
  3.     libxml_disable_entity_loader(true); 
  4.     $xmlstring = simplexml_load_string($xml'SimpleXMLElement', LIBXML_NOCDATA); 
  5.     $val = json_decode(json_encode($xmlstring),true);   
  6.     return $val

得到数组后,我们就可以对数据进行各种处理了。

下面是网上的,代码如下:

  1. class ArrayToXML 
  2.     /** 
  3.      * The main function for converting to an XML document. 
  4.      * Pass in a multi dimensional array and this recrusively 
  5. loops through and builds up an XML document. 
  6.      * 
  7.      * @param array $data 
  8.      * @param string $rootNodeName - what you want the root node to be
  9.  - defaultsto data. 
  10.      * @param SimpleXMLElement $xml - should only be used recursively 
  11.      * @return string XML 
  12.      */ 
  13.     public static function toXml($data$rootNodeName = 'data'$xml=null) 
  14.     { 
  15.         // turn off compatibility mode as simple xml throws a 
  16. wobbly if you don't. 
  17.         if (ini_get('zend.ze1_compatibility_mode') == 1) 
  18.         { 
  19.             ini_set ('zend.ze1_compatibility_mode', 0); 
  20.         } 
  21.         
  22.         if ($xml == null) 
  23.         { 
  24.             $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />"); 
  25.         } 
  26.         
  27.         // loop through the data passed in. 
  28.         foreach($data as $key => $value
  29.         { 
  30.             // no numeric keys in our xml please! 
  31.             if (is_numeric($key)) 
  32.             { 
  33.                 // make string key... 
  34.                 $key = "unknownNode_". (string) $key
  35.             } 
  36.             
  37.             // replace anything not alpha numeric 
  38.             $key = preg_replace('/[^a-z]/i'''$key); 
  39.             
  40.             // if there is another array found recrusively call this function 
  41.             if (is_array($value)) 
  42.             { 
  43.                 $node = $xml->addChild($key); 
  44.                 // recrusive call. 
  45.                 ArrayToXML::toXml($value$rootNodeName$node); 
  46.             } //phpfensi.com 
  47.             else 
  48.             { 
  49.                 // add single node. 
  50.                                 $value = htmlentities($value); 
  51.                 $xml->addChild($key,$value); 
  52.             } 
  53.             
  54.         } 
  55.         // pass back as string. or simple xml object if you want! 
  56.         return $xml->asXML(); 
  57.     } 

下面是我自己编辑的代码:

  1. function arrtoxml($arr,$dom=0,$item=0){ 
  2.     if (!$dom){ 
  3.         $dom = new DOMDocument("1.0"); 
  4.     } 
  5.     if(!$item){ 
  6.         $item = $dom->createElement("root"); 
  7.         $dom->appendChild($item); 
  8.     } 
  9.     foreach ($arr as $key=>$val){ 
  10.         $itemx = $dom->createElement(is_string($key)?$key:"item"); 
  11.         $item->appendChild($itemx); 
  12.         if (!is_array($val)){ 
  13.             $text = $dom->createTextNode($val); 
  14.             $itemx->appendChild($text); 
  15.             
  16.         }else { 
  17.             arrtoxml($val,$dom,$itemx); 
  18.         } 
  19.     } 
  20.     return $dom->saveXML(); 

XML转成数组,代码如下,如果你使用 curl 获取的 xml data.

  1. $xml = simplexml_load_string($data); 
  2. $data['tk'] = json_decode(json_encode($xml),TRUE); 

如果是直接获取 URL 数据的话:

  1. $xml = simplexml_load_file($data); 
  2. $data['tk'] = json_decode(json_encode($xml),TRUE); 

先把 simplexml 对象转换成 json,再将 json 转换成数组。

Tags: PHP数组 XML转换

分享到: