如何使用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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。