一、array转xml
1、一维数组转xml
- 代码
//数组转XML字符串
function arrayToXml($arr) {
$xml = '<xml>';
foreach ($arr as $key => $val) {
$xml.="<{
$key}>{
$val}</{
$key}>";
}
$xml .= "</xml>";
return $xml;
}
- Demo
$array = [
'name' => '姓名',
'age' => 99,
'hobby' => 'study'
];
$xml = self::arrayToXml($array);
die($xml);
- 查看页面源代码,打印
<xml><name>姓名</name><age>99</age><hobby>study</hobby></xml>
2、多维数组转xml
- 多维数组转xml,需要用到递归,代码如下:
/**
* 数组转XML字符串:支持递归
* @param array $data 要转换的数组
* @param bool $root 是否是根节点
* @return string
*/
function arrayToXmlRecur($data, $root = true) {
$str = '';
if ($root) {
//如果是根节点,添加xml开头
//如果是 <?xml 开头,则空字符串结尾
$str .= '<?xml version="1.0" encoding="GBK"?>';
//如果是 <xml> 开头,则</xml>结尾
// $str .= '<xml>';
}
foreach($data as $key => $val) {
if (is_array($val)) {
$child = $this->arrayToXmlRecur($val, false);
$str .= "<$key>$child</$key>";
} else {
// $str.= "<$key><![CDATA[$val]]></$key>"; //微信小程序接口需要用到的
$str.= "<{
$key}>{
$val}</{
$key}>";
}
}
if ($root) {
//如果是根节点,添加xml结尾
//如果是 <?xml 开头,则空字符串结尾
$str .= "";
//如果是 <xml> 开头,则</xml>结尾
// $str .= '</xml>';
}
return $str;
}
- Demo
注意:这里array转xml代码没错,但是转换出来的xml格式是错误的,所以用这个xml转array时会报错:Extra content at the end of the document in file,意思是
文档需要有且有一个根便签,很明显我们这里有2个根标签user other
$array = [
'user' => [
'name' => '姓名',
'age' => 99,
'hobby' => 'study',
'like' => 'you guess',
],
'other' => 1
];
$xml = self::arrayToXmlRecur($array, true);
die($xml);
- 查看页面源代码,打印
<?xml version="1.0" encoding="GBK"?><user><name>姓名</name><age>99</age><hobby>study</hobby><like>you guess</like></user><other>1</other>
3、注意xml的格式
- (1)、如果是
<?xml
开头,则空字符串
结尾 - (2)、如果是
<xml>
开头,则</xml>
结尾 - (3)、
arrayToXmlRecur
存在的问题arrayToXml
是<xml>
开头,根标签是xml
,所以转换出来的xml是正确格式
的arrayToXmlRecur
是<?xml
开头,没有根标签
,我们需要判断数组的长度为1,才可进行转换,否则提示:格式有误,xml文档根节点不存在
,arrayToXmlRecur 修改如下:
/**
* 数组转XML字符串:支持递归
* @param array $data 要转换的数组
* @param bool $root 是否是根节点
* @return string
*/
function arrayToXmlRecur($data, $root = true) {
$str = '';
if ($root) {
//如果是根节点,添加xml开头
//无根节点需要判断数组长度:长度为1,表示有且有一个根节点
if (count($data) != 1) {
die('格式有误,xml文档根节点不存在');
}
//如果是 <?xml 开头,则空字符串结尾:无根节点
$str .= '<?xml version="1.0" encoding="GBK"?>';
//如果是 <xml> 开头,则</xml>结尾:有根节点
// $str .= '<xml>';
}
foreach($data as $key => $val) {
if (is_array($val)) {
$child = $this->arrayToXmlRecur($val, false);
$str .= "<$key>$child</$key>";
} else {
// $str.= "<$key><![CDATA[$val]]></$key>"; //微信小程序接口需要用到的
$str.= "<{
$key}>{
$val}</{
$key}>";
}
}
if ($root) {
//如果是根节点,添加xml结尾
//如果是 <?xml 开头,则空字符串结尾
$str .= "";
//如果是 <xml> 开头,则</xml>结尾
// $str .= '</xml>';
}
return $str;
}
二、xml转array
1、 代码
//将xml转为array
public function xmlToArray($xml) {
if (!$xml) {
die('xml数据异常');
}
//禁止引用外部xml实体 防XXE注入
libxml_disable_entity_loader(true);//禁止引用外部xml实体
//将XML转为array
$arrayData = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arrayData;
}
2、转换一维xml
- Demo
$xml = '<xml><name>姓名</name><age>99</age><hobby>study</hobby></xml>';
$array = self::xmlToArray($xml);
var_export($array);
die;
- 打印
array ( 'name' => '姓名', 'age' => '99', 'hobby' => 'study', )
3、转换多维xml
- Demo
//加一个根标签root,防止转换时由于根标签有多个报错:Extra content at the end of the document in file
$xml = '<?xml version="1.0" encoding="utf-8"?><root><user><name>姓名</name><age>99</age><hobby>study</hobby><like>you guess</like></user><other>1</other></root>';
$array = self::xmlToArray($xml);
var_export($array);
die;
- 打印(注意:
root
根标签转换之后就不见了
)
array ( 'user' => array ( 'name' => '姓名', 'age' => '99', 'hobby' => 'study', 'like' => 'you guess', ), 'other' => '1', )
转载:https://blog.csdn.net/qq_36025814/article/details/116640947
查看评论