php源码之将数组转化为xml

时间:2016-11-04
经常遇到数组转xml的需求,实现方法有很多种,但原理基本都是借助第三方的类库,今天小编向大家介绍自己写的一个php数组转化为xml的实现源码,具有一定的参考价值,需要的朋友可以参考一下。

第一种方法:源码如下。

<?php
$elementLevel = 0 ;
function array_Xml($array, $keys = '')
{
global $elementLevel;
if(!is_array($array))
{
  if($keys == ''){
  return $array;
  }else{
  return "\n<$keys>" . $array . "</$keys>\n";
  }
}else{
  foreach ($array as $key => $value)
  {
  $haveTag = true;
  if (is_numeric($key))
  {
   $key = $keys;
   $haveTag = false;
  }
  /* http://www.manongjc.com/article/1586.html */
  if($elementLevel == 0 )
  {
   $startElement = "<$key>";
   $endElement = "</$key>";
  }
  $text .= $startElement;
  if(!$haveTag)
  {
   $elementLevel++;
   $text .= "<$key>" . array_Xml($value, $key). "</$key>\n";
  }else{
   $elementLevel++;
   $text .= array_Xml($value, $key);
  }
  $text .= $endElement;
  }
}
return $text;
}
$array = array(
"employees" => array(
"employee" => array(
array(
"name" => "name one",
"position" => "position one"
),
array(
"name" => "name two",
"position" => "position two"
),
array(
"name" => "name three",
"position" => "position three"
)
)
)
);
echo array_Xml($array);
?>

第二种方法:

这种方法可以支持多维数组

test.php

<?php
include './ArrayToXML.php';
header('Content-Type:   text/xml');
$data=array("name"=>"zhangsan","sex"=>"0","address"=>array("sheng"=>"chongqing","shi"=>"nanchuan","zhen"=>"daguan"));
echo ArrayToXML::toXml($data);
?>

处理代码:ArrayToXML.php

<?php
class ArrayToXML
{
 /**
  * The main function for converting to an XML document.
  * Pass in a multi dimensional array and this recrusively loops through and builds up an XML document.
  *
  * @param array $data
  * @param string $rootNodeName - what you want the root node to be - defaultsto data.
  * @param SimpleXMLElement $xml - should only be used recursively
  * @return string XML
  */
 public static function toXml($data, $rootNodeName = 'data', $xml=null)
 {
  // turn off compatibility mode as simple xml throws a wobbly if you don't.
  if (ini_get('zend.ze1_compatibility_mode') == 1)
  {
   //  http://www.manongjc.com
   ini_set ('zend.ze1_compatibility_mode', 0);
  }
  if ($xml == null)
  {
   $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />");
  }
  // loop through the data passed in.
  foreach($data as $key => $value)
  {
   // no numeric keys in our xml please!
   if (is_numeric($key))
   {
    // make string key...
    $key = "unknownNode_". (string) $key;
   }
   // replace anything not alpha numeric
   $key = preg_replace('/[^a-z]/i', '', $key);
   // if there is another array found recrusively call this function
   if (is_array($value))
   {
    $node = $xml->addChild($key);
    // recrusive call.
    ArrayToXML::toXml($value, $rootNodeName, $node);
   }
   else
   {
    // add single node.
    $value = htmlentities($value);
    $xml->addChild($key,$value);
   }
  }
  // pass back as string. or simple xml object if you want!
  return $xml->asXML();
 }
}

上面两种方法都可以实现将数组转化为xml,希望对大家有一定的帮助。