飞道的博客

PHP array(递归)转xml,xml转array

356人阅读  评论(0)

一、array转xml

1、一维数组转xml

  • 代码
//数组转XML字符串
function arrayToXml($arr) {
   
    $xml = '<xml>';
    foreach ($arr as $key => $val) {
   
        $xml.="<{
     $key}>{
     $val}</{
     $key}>";
    }
    $xml .= "</xml>";
    return $xml;
}
  • Demo
$array = [
    'name' => '姓名',
    'age' => 99,
    'hobby' => 'study'
];
$xml = self::arrayToXml($array);

die($xml);
  • 查看页面源代码,打印
<xml><name>姓名</name><age>99</age><hobby>study</hobby></xml>

2、多维数组转xml

  • 多维数组转xml,需要用到递归,代码如下:
/**
 * 数组转XML字符串:支持递归
 * @param array $data 要转换的数组
 * @param bool $root 是否是根节点
 * @return string
 */
function arrayToXmlRecur($data, $root = true) {
   
    $str = '';

    if ($root) {
    //如果是根节点,添加xml开头
        //如果是 <?xml 开头,则空字符串结尾
        $str .= '<?xml version="1.0" encoding="GBK"?>';

        //如果是 <xml> 开头,则</xml>结尾
//        $str .= '<xml>';
    }

    foreach($data as $key => $val) {
   
        if (is_array($val)) {
   
            $child = $this->arrayToXmlRecur($val, false);
            $str .= "<$key>$child</$key>";
        } else {
   
//                $str.= "<$key><![CDATA[$val]]></$key>"; //微信小程序接口需要用到的
            $str.= "<{
     $key}>{
     $val}</{
     $key}>";
        }
    }
        if ($root) {
    //如果是根节点,添加xml结尾
            //如果是 <?xml 开头,则空字符串结尾
            $str .= "";

            //如果是 <xml> 开头,则</xml>结尾
//            $str .= '</xml>';
        }
    return $str;
}
  • Demo

注意:这里array转xml代码没错,但是转换出来的xml格式是错误的,所以用这个xml转array时会报错:Extra content at the end of the document in file,意思是文档需要有且有一个根便签,很明显我们这里有2个根标签user other

$array = [
    'user' => [
        'name' => '姓名',
        'age' => 99,
        'hobby' => 'study',
        'like' => 'you guess',
    ],
    'other' => 1
];
$xml = self::arrayToXmlRecur($array, true);
die($xml);
  • 查看页面源代码,打印
<?xml version="1.0" encoding="GBK"?><user><name>姓名</name><age>99</age><hobby>study</hobby><like>you guess</like></user><other>1</other>

3、注意xml的格式

  • (1)、如果是 <?xml 开头,则空字符串结尾
  • (2)、如果是 <xml> 开头,则</xml>结尾
  • (3)、arrayToXmlRecur存在的问题
    • arrayToXml<xml>开头,根标签是xml,所以转换出来的xml是正确格式
    • arrayToXmlRecur<?xml开头,没有根标签,我们需要判断数组的长度为1,才可进行转换,否则提示:格式有误,xml文档根节点不存在arrayToXmlRecur 修改如下
/**
 * 数组转XML字符串:支持递归
 * @param array $data 要转换的数组
 * @param bool $root 是否是根节点
 * @return string
 */
function arrayToXmlRecur($data, $root = true) {
   
    $str = '';

    if ($root) {
    //如果是根节点,添加xml开头
        //无根节点需要判断数组长度:长度为1,表示有且有一个根节点
        if (count($data) != 1) {
   
            die('格式有误,xml文档根节点不存在');
        }

        //如果是 <?xml 开头,则空字符串结尾:无根节点
        $str .= '<?xml version="1.0" encoding="GBK"?>';

        //如果是 <xml> 开头,则</xml>结尾:有根节点
//        $str .= '<xml>';
    }

    foreach($data as $key => $val) {
   
        if (is_array($val)) {
   
            $child = $this->arrayToXmlRecur($val, false);
            $str .= "<$key>$child</$key>";
        } else {
   
//                $str.= "<$key><![CDATA[$val]]></$key>"; //微信小程序接口需要用到的
            $str.= "<{
     $key}>{
     $val}</{
     $key}>";
        }
    }
        if ($root) {
    //如果是根节点,添加xml结尾
            //如果是 <?xml 开头,则空字符串结尾
            $str .= "";

            //如果是 <xml> 开头,则</xml>结尾
//            $str .= '</xml>';
        }
    return $str;
}

二、xml转array

1、 代码

//将xml转为array
public function xmlToArray($xml) {
   
    if (!$xml) {
   
        die('xml数据异常');
    }
    //禁止引用外部xml实体 防XXE注入
    libxml_disable_entity_loader(true);//禁止引用外部xml实体
    //将XML转为array
    $arrayData = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $arrayData;
}

2、转换一维xml

  • Demo
$xml = '<xml><name>姓名</name><age>99</age><hobby>study</hobby></xml>';
$array = self::xmlToArray($xml);
var_export($array);
die;
  • 打印
array ( 'name' => '姓名', 'age' => '99', 'hobby' => 'study', )

3、转换多维xml

  • Demo
//加一个根标签root,防止转换时由于根标签有多个报错:Extra content at the end of the document in file
$xml = '<?xml version="1.0" encoding="utf-8"?><root><user><name>姓名</name><age>99</age><hobby>study</hobby><like>you guess</like></user><other>1</other></root>';
$array = self::xmlToArray($xml);
var_export($array);
die;
  • 打印(注意:root 根标签转换之后就不见了
array ( 'user' => array ( 'name' => '姓名', 'age' => '99', 'hobby' => 'study', 'like' => 'you guess', ), 'other' => '1', )

转载:https://blog.csdn.net/qq_36025814/article/details/116640947
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场