Home  >  Article  >  Backend Development  >  How to convert php array to xml?

How to convert php array to xml?

coldplay.xixi
coldplay.xixiOriginal
2020-07-18 13:12:363716browse

How to convert php array to xml: 1. Without using the callback function, the code is [function outXmlFile($file, $xml_str)]; 2. The callback method generates irregular xml, the code is [$this ->arrTo_Xml($value, $key)].

How to convert php array to xml?

How to convert php array to xml:

Method 1: Native writing

<?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;

Method 2: Hard-coded method, without using callback function

 /**
 * 把特定格式的数组转化成XML
 *
 * @param $arr  array  数组格式如下
 * @param string $rootNodeName 最外层节点(根节点)
 * @return string
 */
function arrToXml($arr, $rootNodeName = &#39;index&#39;)
{
    $Dom = new DOMDocument(&#39;1.0&#39;, &#39;utf-8&#39;);
 
    // 根节点
    $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 == &#39;sitemapindex&#39;) {
            $lastmodNode = $Dom->createElement(&#39;lastmod&#39;, $value["lastmod"]);
        } else {
            $lastmodNode = $Dom->createElement(&#39;lastmod&#39;);
            $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(&#39;www.baidu.com/sitic.xml&#39;, $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>
 */

Method 3: Callback method, can generate irregular xml (method call, Same as method two)

/**
 * @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 = &#39;index&#39;, $element = &#39;&#39;, $Dom = &#39;&#39;)
{
    $Dom = empty($Dom) ? new DOMDocument(&#39;1.0&#39;, &#39;utf-8&#39;) : $Dom;
 
    if ($element == &#39;&#39;) {
        $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, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
 
    return $data;
}

Related learning recommendations:PHP programming from entry to master

The above is the detailed content of How to convert php array to xml?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn