Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PHP数组转换为XML?_Php_Xml - Fatal编程技术网

将PHP数组转换为XML?

将PHP数组转换为XML?,php,xml,Php,Xml,假设我有这样一个数组: <?php $colors=array(); $colors[0]['id']=1; $colors[0]['color']='blue'; $colors[1]['id']=2; $colors[1]['color']='green'; ...... ?> 将整个数组转换为XML的最简单方法是什么 有关现场数据的一些工作示例: 原答覆如下: 看看这些预定义的实现: 如果您还希望属性支持将数组转换为XML,可以使用以下实现: 对于属性支持,它要

假设我有这样一个数组:

<?php
$colors=array();

$colors[0]['id']=1;
$colors[0]['color']='blue';


$colors[1]['id']=2;
$colors[1]['color']='green';

......
?>

将整个数组转换为XML的最简单方法是什么

有关现场数据的一些工作示例:

原答覆如下:

看看这些预定义的实现:


如果您还希望属性支持将数组转换为XML,可以使用以下实现:


对于属性支持,它要求您以特定的方式构造数组。对于没有属性的xml,您可以直接将任何数组传递给函数并获得xml,您可以自己创建一个简单的函数,只输出它。例如,将包含元素的数组传递给函数,并告知父元素(文档的根元素)的名称和每个元素的名称

我假设父元素为
colors
,每个元素为
color

我还假设命名键是
color
元素的子元素:

function xml_from_indexed_array($array, $parent, $name) {

    echo '<?xml version="1.0"?>', "\n";
    echo "<$parent>\n";
    foreach ($array as $element) {
        echo "  <$name>\n";
        foreach ($element as $child => $value) {
            echo "    <$child>$value</$child>\n";
        }
        echo "  </$name>\n";
    }
    echo "</$parent>\n";
}
函数xml\u来自索引数组($array,$parent,$name){
回显“”,“\n”;
回音“\n”;
foreach($array作为$element){
回音“\n”;
foreach($child形式的元素=>$value){
回显“$value\n”;
}
回音“\n”;
}
回音“\n”;
}
正如您所看到的,这是非常直接的,只是迭代所有元素

用法示例:

<?php
$colors = array();

$colors[0]['id']    = 1;
$colors[0]['color'] = 'blue';

$colors[1]['id']    = 2;
$colors[1]['color'] = 'green';

xml_from_indexed_array($colors, 'colors', 'color');

做这件事花了我好几个小时。我真的不敢相信PHP没有一个函数可以为您做到这一点。不管怎样,我希望这对某人有帮助。享受吧

<?php
class Xml
{
  public function getXmlFromArray($value, \SimpleXMLElement &$xmlElement, $entity, $starting = null)
{

    $handleValue = function($value){
        $entityHandler = $this->getEntityHandler();
        if($entityHandler && $entityHandler instanceof \Closure){
            $value = $entityHandler($value);
        }
        if(is_string($value)){
            $value = htmlspecialchars($value);
        }
        return $value;
    };
    $addChild = function($name, $value, &$subNode = null)use(&$xmlElement, $handleValue, $entity){
        if(is_array($value)){
            if(!$subNode instanceof \SimpleXMLElement){
                $currentKey = key($value);
                $initialValue = null;
                if(is_numeric($currentKey)){
                    if(!is_array($value[$currentKey])){
                        $initialValue = $value[$currentKey];
                        unset($value[$currentKey]);
                    }
                }
                $subNode = $xmlElement->addChild($this->cleanXmlTagName($name), $initialValue);
            }
            $this->getXmlFromArray($handleValue($value), $subNode, $name);
        } else {
            $xmlElement->addChild($this->cleanXmlTagName($name), $handleValue($value));
        }
    };

    if(is_array($value))
    {
        if(is_numeric(key($value))){
            $setSubNodePrimitiveValue = function($value)use(&$xmlElement, $entity, $handleValue){
                $value = $handleValue($value);
                $children = $xmlElement->children();
                $children[] = $value;
            };
            foreach ($value as $item)
            {
                if(!is_array($item)){
                    $setSubNodePrimitiveValue($item);
                } else {
                    if($starting === true){
                        $addChild($entity, $item);
                    } else {
                        $addChild($entity, $item, $xmlElement);
                    }
                }
            }
        } else {
            foreach ($value as $subEntity => $subEntityItem)
            {
                if(is_array($subEntityItem) && is_array(current($subEntityItem)) && is_numeric(key($subEntityItem))){
                    $this->getXmlFromArray($subEntityItem, $xmlElement, $subEntity, true);
                    continue;
                }
                $addChild($subEntity, $subEntityItem);
            }
        }
    } else {
        $xmlElement->addChild($this->cleanXmlTagName($entity), $handleValue($value));
    }
}

public function cleanXmlTagName(string $tagName)
{
    if(is_numeric($tagName[0])){
        $tagName = '_'.$tagName;
    }
    return preg_replace('/[^A-Za-z0-9.\-_]/', '_', $tagName);
}

  /**
   * @param array $array
   * @param string $openingTag
   * @param string $entity
   * @param string $nameSpace
   * @param bool $isPrefixed
   * @return \SimpleXMLElement
   */
  public function generateXmlFromArray(array $array, string $openingTag, string $entity, $nameSpace = '', $isPrefixed = false)
  {
      $xmlString = '<'.$openingTag.'></'.$openingTag.'>';
      $xml = new \SimpleXMLElement($xmlString, LIBXML_NOERROR, false, $nameSpace, $isPrefixed);
      $this->getXmlFromArray($array, $xml, $entity, true);
      return $xml;
  }

  /**
   * @param string $xml
   * @return bool
   */
  public function validateXml(string $xml)
  {
      $dom = new \DOMDocument();
      $dom->loadXML($xml);
      return $dom->validate();
  }

  public function loadXmlPathAsArray(string $xmlPath)
  {
      $xml   = simplexml_load_file($xmlPath);
      $array = json_decode(json_encode($xml), TRUE);
      return (array)$array;
  }

  /**
   * @param string $xmlString
   * @return array
   */
  public function loadXmlStringAsArray(string $xmlString)
  {
      $array = (array) @simplexml_load_string($xmlString);
      if(!$array){
          $array = (array) @json_decode($xmlString, true);
      } else{
          $array = (array)@json_decode(json_encode($array), true);
      }
      return $array;
  }

  /**
   * @param string $xmlString
   * @return \SimpleXMLElement
   */
  public function loadXmlString(string $xmlString)
  {
      return @simplexml_load_string($xmlString);
  }
}
getEntityHandler();
if($entityHandler&&$entityHandler instanceof\Closure){
$value=$entityHandler($value);
}
如果(是字符串($value)){
$value=htmlspecialchars($value);
}
返回$value;
};
$addChild=function($name,$value,&$subNode=null)use(&$xmlement,$handleValue,$entity){
if(是_数组($value)){
if(!$subNode instanceof\simplexmlement){
$currentKey=key($value);
$initialValue=null;
如果(是数字($currentKey)){
如果(!是数组($value[$currentKey])){
$initialValue=$value[$currentKey];
未设置($value[$currentKey]);
}
}
$subNode=$xmlement->addChild($this->cleanXmlTagName($name),$initialValue);
}
$this->getXmlFromArray($handleValue($value),$subNode,$name);
}否则{
$xmlElement->addChild($this->cleanXmlTagName($name),$handleValue($value));
}
};
if(是_数组($value))
{
如果(是数字(键($value))){
$setSubNodePrimitiveValue=函数($value)使用(&$xmlElement,$entity,$handleValue){
$value=$handleValue($value);
$children=$xmlement->children();
$children[]=$value;
};
foreach(价值为$item)
{
如果(!is_数组($item)){
$setSubNodePrimitiveValue($item);
}否则{
如果($starting==true){
$addChild($entity,$item);
}否则{
$addChild($entity,$item,$xmlElement);
}
}
}
}否则{
foreach($subEntity=>$subEntityItem的值)
{
if(is_数组($subEntityItem)&&is_数组(当前($subEntityItem))&&is_数值(键($subEntityItem))){
$this->getXmlFromArray($subEntityItem、$xmlElement、$subEntity,true);
继续;
}
$addChild($subEntity,$subEntityItem);
}
}
}否则{
$xmlElement->addChild($this->cleanXmlTagName($entity),$handleValue($value));
}
}
公共函数cleanXmlTagName(字符串$tagName)
{
如果(是数值($tagName[0])){
$tagName='.'.$tagName;
}
返回preg\u replace('/[^A-Za-z0-9.\-\u]/','\ u',$tagName);
}
/**
*@param数组$array
*@param string$openingTag
*@param string$entity
*@param string$命名空间
*@param bool$isPrefixed
*@return\simplexmlement
*/
公共函数generateXmlFromArray(数组$array,字符串$openingTag,字符串$entity,$nameSpace='',$isPrefixed=false)
{
$xmlString='';
$xml=new\simplexmlement($xmlString,LIBXML\NOERROR,false,$nameSpace,$isPrefixed);
$this->getXmlFromArray($array,$xml,$entity,true);
返回$xml;
}
/**
*@param string$xml
*@returnbool
*/
公共函数validateXml(字符串$xml)
{
$dom=new\DOMDocument();
$dom->loadXML($xml);
返回$dom->validate();
}
公共函数loadXmlPathAsArray(字符串$xmlPath)
{
$xml=simplexml\u加载文件($xmlPath);
$array=json_decode(json_encode($xml),TRUE);
返回(数组)$array;
}
/**
*@param string$xmlString
*@return数组
*/
公共函数loadXmlStringAsArray(字符串$xmlString)
{
$array=(array)@simplexml\u load\u string($xmlString);
if(!$array){
$array=(array)@json_decode($xmlString,true);
}否则{
$array=(array)@json_decode(json_encode($array),true);
}
返回$array;
}
/**
*@param string$xmlString
*@return\simplexmlement
*/
公共函数loadXmlString(字符串$xmlString)
{
return@simplexml\u load\u string($xmlString);
}
}

第一个链接没有回答问题,第二个链接消失了。请复习你的答案。我还添加了一个类似问题答案的附加链接$xml->generateXmlFromArray($array,'entities','entity');
<?php
class Xml
{
  public function getXmlFromArray($value, \SimpleXMLElement &$xmlElement, $entity, $starting = null)
{

    $handleValue = function($value){
        $entityHandler = $this->getEntityHandler();
        if($entityHandler && $entityHandler instanceof \Closure){
            $value = $entityHandler($value);
        }
        if(is_string($value)){
            $value = htmlspecialchars($value);
        }
        return $value;
    };
    $addChild = function($name, $value, &$subNode = null)use(&$xmlElement, $handleValue, $entity){
        if(is_array($value)){
            if(!$subNode instanceof \SimpleXMLElement){
                $currentKey = key($value);
                $initialValue = null;
                if(is_numeric($currentKey)){
                    if(!is_array($value[$currentKey])){
                        $initialValue = $value[$currentKey];
                        unset($value[$currentKey]);
                    }
                }
                $subNode = $xmlElement->addChild($this->cleanXmlTagName($name), $initialValue);
            }
            $this->getXmlFromArray($handleValue($value), $subNode, $name);
        } else {
            $xmlElement->addChild($this->cleanXmlTagName($name), $handleValue($value));
        }
    };

    if(is_array($value))
    {
        if(is_numeric(key($value))){
            $setSubNodePrimitiveValue = function($value)use(&$xmlElement, $entity, $handleValue){
                $value = $handleValue($value);
                $children = $xmlElement->children();
                $children[] = $value;
            };
            foreach ($value as $item)
            {
                if(!is_array($item)){
                    $setSubNodePrimitiveValue($item);
                } else {
                    if($starting === true){
                        $addChild($entity, $item);
                    } else {
                        $addChild($entity, $item, $xmlElement);
                    }
                }
            }
        } else {
            foreach ($value as $subEntity => $subEntityItem)
            {
                if(is_array($subEntityItem) && is_array(current($subEntityItem)) && is_numeric(key($subEntityItem))){
                    $this->getXmlFromArray($subEntityItem, $xmlElement, $subEntity, true);
                    continue;
                }
                $addChild($subEntity, $subEntityItem);
            }
        }
    } else {
        $xmlElement->addChild($this->cleanXmlTagName($entity), $handleValue($value));
    }
}

public function cleanXmlTagName(string $tagName)
{
    if(is_numeric($tagName[0])){
        $tagName = '_'.$tagName;
    }
    return preg_replace('/[^A-Za-z0-9.\-_]/', '_', $tagName);
}

  /**
   * @param array $array
   * @param string $openingTag
   * @param string $entity
   * @param string $nameSpace
   * @param bool $isPrefixed
   * @return \SimpleXMLElement
   */
  public function generateXmlFromArray(array $array, string $openingTag, string $entity, $nameSpace = '', $isPrefixed = false)
  {
      $xmlString = '<'.$openingTag.'></'.$openingTag.'>';
      $xml = new \SimpleXMLElement($xmlString, LIBXML_NOERROR, false, $nameSpace, $isPrefixed);
      $this->getXmlFromArray($array, $xml, $entity, true);
      return $xml;
  }

  /**
   * @param string $xml
   * @return bool
   */
  public function validateXml(string $xml)
  {
      $dom = new \DOMDocument();
      $dom->loadXML($xml);
      return $dom->validate();
  }

  public function loadXmlPathAsArray(string $xmlPath)
  {
      $xml   = simplexml_load_file($xmlPath);
      $array = json_decode(json_encode($xml), TRUE);
      return (array)$array;
  }

  /**
   * @param string $xmlString
   * @return array
   */
  public function loadXmlStringAsArray(string $xmlString)
  {
      $array = (array) @simplexml_load_string($xmlString);
      if(!$array){
          $array = (array) @json_decode($xmlString, true);
      } else{
          $array = (array)@json_decode(json_encode($array), true);
      }
      return $array;
  }

  /**
   * @param string $xmlString
   * @return \SimpleXMLElement
   */
  public function loadXmlString(string $xmlString)
  {
      return @simplexml_load_string($xmlString);
  }
}