php 数组xml,php数组如何转xml?

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

befafd24093b2394e409649d09fc9306.png

php数组转xml的方法:

方法一:原生的写法<?php

/**

* 简单原生的数组转为xml

* @param $arr

* @return string

*/

function arrayToXml($arr)

{

$xml = "";

foreach ($arr as $key => $val) {

if (is_array($val)) {

$xml .= "" . arrayToXml($val) . "" . $key . ">";

} else {

$xml .= "" . $val . "" . $key . ">";

}

}

$xml .= "";

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"]);// 生成日期特殊形式:

$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"?>

*

*

* http://www.php.com/refessories/ind_10-gen_3/

*

*

*

* http://www.php.com/refeessories/ind_12-gen_5/

*

*

*

* http://www.php.com/refeessories/ind_15-gen_5/

*

*

*

*/

方法三: 回调方法,可以生成不规则的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); // 生成日期特殊形式:

$element->appendChild($cdata);

} else {

$element = $Dom->createElement($key, $value);// 用createElement创建出来的都是一行(例如:xingmimng

}

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值