您好,登錄后才能下訂單哦!
如何使用php數組轉xml?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
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; }
關于如何使用php數組轉xml問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。