php数组如何转xml?

2020-08-13 08:14:39

php数组转xml的方法:1、不使用回调函数,代码为【function outXmlFile($file, $xml_str)】;2、回调方法,生成不规则的xml,代码为【$this->arrTo_Xml($value, $key)】。

php数组转xml的方法:

方法一:原生的写法

<?php/** * 简单原生的数组转为xml * @param $arr * @return string */function arrayToXml($arr){    $xml = "<root>";    foreach ($arr as $key => $val) {        if (is_array($val)) {            $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";        } else {            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";        }    }    $xml .= "</root>";    return $xml;} $arr = array();$arr["url"] = array(    1 => array(        "loc" => "http://www.php.com/refessories/ind_10-gen_3/",        "lastmod" => "2018/10/09"    ),    2 => array(        "loc" => "http://www.php.com/refeessories/ind_12-gen_5/",        "lastmod" => "2018/10/09"    ),    3 => array(        "loc" => "http://www.php.com/refeessories/ind_15-gen_5/",        "lastmod" => "2018/10/09"    ),); $simple_arrtoxml = arrayToXml($arr); var_dump($simple_arrtoxml);exit;

方法二:写死的方法,没有使用回调函数

 /** * 把特定格式的数组转化成XML * * @param $arr  array  数组格式如下 * @param string $rootNodeName 最外层节点(根节点) * @return string */function arrToXml($arr, $rootNodeName = 'index'){    $Dom = new DOMDocument('1.0', 'utf-8');     // 根节点    $root_node = $Dom->createElement($rootNodeName);    $Dom->appendChild($root_node);     //第一个节点    $firstNodeName = key($arr);    //循环节点    foreach ($arr[$firstNodeName] as $value) {        $firstNode = $Dom->createElement($firstNodeName);        $root_node->appendChild($firstNode);         $locNode = $Dom->createElement("loc", $value["loc"]);        $firstNode->appendChild($locNode);         if ($rootNodeName == 'sitemapindex') {            $lastmodNode = $Dom->createElement('lastmod', $value["lastmod"]);        } else {            $lastmodNode = $Dom->createElement('lastmod');            $cdata = $Dom->createCDATASection($value["lastmod"]);// 生成日期特殊形式:<![CDATA[2017/09/29]]>            $lastmodNode->appendChild($cdata);        }        $firstNode->appendChild($lastmodNode);    }    $Dom->formatOutput = true;//将特殊形式输出出来    $result = $Dom->saveXML();    return $result;} /** * 输出xml数据到xml文件中 * * @param $file  string 文件名 * @param $xml_str * @return bool|int */function outXmlFile($file, $xml_str){    echo "生成 ", $file, " 成功!", PHP_EOL;    return file_put_contents($file, $xml_str);} /******************** 写死的方法,没有使用回调函数 **************************/$result = array();$result["url"] = array(    1 => array(        "loc" => "http://www.php.com/refessories/ind_10-gen_3/",        "lastmod" => "2018/10/09"    ),    2 => array(        "loc" => "http://www.php.com/refeessories/ind_12-gen_5/",        "lastmod" => "2018/10/09"    ),    3 => array(        "loc" => "http://www.php.com/refeessories/ind_15-gen_5/",        "lastmod" => "2018/10/09"    ),); $res = arrToXml($result, "ulrset");// outXmlFile('www.baidu.com/sitic.xml', $res);  // 自己选择要保存的位置var_dump($res);exit; // ==========================================================// 结果:/** * <?xml version="1.0" encoding="utf-8"?> * <ulrset> * <url> * <loc>http://www.php.com/refessories/ind_10-gen_3/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * <url> * <loc>http://www.php.com/refeessories/ind_12-gen_5/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * <url> * <loc>http://www.php.com/refeessories/ind_15-gen_5/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * </ulrset> */

方法三: 回调方法,可以生成不规则的xml ( 方法调用,与方法二一样 )

/** * @param array $arr 数组 * @param int $dom Document * @param int $item * @return string */function arr_to_xml($arr, $dom = 0, $item = 0){    if (!$dom) {        $dom = new DOMDocument("1.0");    }    if (!$item) {        $item = $dom->createElement("root");// 根节点        $dom->appendChild($item);    }    foreach ($arr as $key => $val) {        $itemx = $dom->createElement(is_string($key) ? $key : "item");        $item->appendChild($itemx);        if (!is_array($val)) {            $text = $dom->createTextNode($val);// 创建一个文本节点            $itemx->appendChild($text);         } else {            arr_to_xml($val, $dom, $itemx); // 自己调用自己        }    }    return $dom->saveXML();}  //  或者下面的这种回调方法 /** * 把特定格式的数组转化成XML * * @param $arr * @param string $nodeName xml子节点 * @param string $element * @param string $Dom * @return string */function arrTo_Xml($arr, $nodeName = 'index', $element = '', $Dom = ''){    $Dom = empty($Dom) ? new DOMDocument('1.0', 'utf-8') : $Dom;     if ($element == '') {        $data = $Dom->createElement($nodeName);        $Dom->appendChild($data);    } else {        $data = $element;    }    foreach ($arr as $key => $value) {        if (is_array($value)) {            if (!is_numeric($key)) {                $element = $Dom->createElement($key);                $data->appendChild($element);            }            $this->arrTo_Xml($value, $key, $element, $Dom);// 自己调用自己        } else {            if ($key == "lastmod") {                $element = $Dom->createElement($key);                $cdata = $Dom->createCDATASection($value); // 生成日期特殊形式:<![CDATA[2017/09/29]]>                $element->appendChild($cdata);            } else {                $element = $Dom->createElement($key, $value);// 用createElement创建出来的都是一行(例如:<username>xingmimng</username>            }             $data->appendChild($element);// 创建的一行放在哪个 xml的节点下        }    }     $Dom->formatOutput = true;// 输出特殊形式    $result = $Dom->saveXML();    unset($Dom);// 释放资源    return $result;} // 数据结构    $result = array();$result["url"] = array(    1 => array(        "loc" => "http://www.php.com/refessories/ind_10-gen_3/",        "lastmod" => "2018/10/09"    ),    2 => array(        "loc" => "http://www.php.com/refeessories/ind_12-gen_5/",        "lastmod" => "2018/10/09"    ),    3 => array(        "loc" => "http://www.php.com/refeessories/ind_15-gen_5/",        "lastmod" => "2018/10/09"    ),);  /************************************************************************************ * 附加:  xml转为array *************************************************************************************/ /** * 将xml转为array * @param string $xml * return array */function xml_to_array($xml){    if (!$xml) {        return false;    }     //将XML转为array    //禁止引用外部xml实体    libxml_disable_entity_loader(true);     $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);     return $data;}
相关文章 大家在看