php之数组转xml,xml转数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaokcl/article/details/82985906
<?php

/***********************************************
 * 说明: 方法一到三 : array to xml
 * 附加: xml to array
 ***********************************************/

/********************************************************************
 * 方法一:原生的写法
 *******************************************************************/

/**
 * 简单原生的数组转为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;
}
      

猜你喜欢

转载自blog.csdn.net/gaokcl/article/details/82985906