简介:PHP解析XML数据转php的数组,数组转XML
1. XML是什么?
xml是一种通用的数据交换格式。是电子文档交换标准,是一种标记语言,语法和html类似。xml语法简单,易于创建。结构清晰,便于理解和阅读。
2. XML转数组
PHP无法直接将XML数据转成数组格式,但是我们可以将XML数据先转换成json格式的字符串,再将json字符串转换成数组。
虽然PHP没有直接解析XML的函数,但是提供了 DOMDocument 对象(PHP5之后提供的扩展)解析XML。
2.1. 只有一个元素的XML转数组
PHP解析XML需要用到 libxml_disable_entity_loader() 和 simplexml_load_string() 方法。
libxml_disable_entity_loader()方法的主要作用是禁止使用加载外部实体,如果不启用可能会被黑客利用执行外部程序。为了程序安全建议大家在使用之前统统设置为开启状态。
simplexml_load_string()方法的主要作用就是将XML数据转换成 SimpleXMLElement 对象,之后就可以将 SimpleXMLElement 对象转换成json字符串了。就像下方示例代码一样:
<?php
$xml_str = '<?xml version="1.0"?>
<Report><MsgID>cxx</MsgID><Mobile>13216461915</Mobile><Submit_time>2023-10-20 09:29</Submit_time></Report>';
// 禁止加载外部实体
libxml_disable_entity_loader(true);
// 将XML转SimpleXMLElement对象
$simpleXmlObj = simplexml_load_string($xml_str, 'SimpleXMLElement', LIBXML_NOCDATA);
// 将SimpleXMLElement对象转json字符串
$json_str = json_encode($simpleXmlObj);
// json字符串转数组
$data = json_decode($json_str, true);
var_dump($data);
打印结果如下:
array(1) {
["Report"]=>
array(3) {
["MsgID"]=>
string(3) "cxx"
["Mobile"]=>
string(11) "13216461915"
["Submit_time"]=>
string(16) "2023-10-20 09:29"
}
}
2.2. 多个元素的XML转数组
如果xml中的 Report 只有一个元素时解析成数组后是一位的数组。但是如果XMl中有两个子成员解析后是一个二维数组,例如下方的XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Response>
<Report>
<MsgID>短信批次号</MsgID>
<Mobile>手机号码</Mobile>
<Submit_time>提交时间(yyyy-MM-dd HH:mm:ss)</Submit_time>
</Report>
<Report>
<MsgID>短信批次号</MsgID>
<Mobile>手机号码</Mobile>
<Submit_time>提交时间(yyyy-MM-dd HH:mm:ss)</Submit_time>
</Report>
</Response>
解析成数组后为:
array(1) {
["Report"]=>
array(2) {
[0]=>
array(7) {
["MsgID"]=>
string(15) "短信批次号"
["Mobile"]=>
string(12) "手机号码"
["Submit_time"]=>
string(37) "提交时间(yyyy-MM-dd HH:mm:ss)"
}
[1]=>
array(7) {
["MsgID"]=>
string(15) "短信批次号"
["Mobile"]=>
string(12) "手机号码"
["Submit_time"]=>
string(37) "提交时间(yyyy-MM-dd HH:mm:ss)"
}
}
}
注意:Report下面是一个二维数组
3. 数组转XML
XML转数组之前我们通过将XML转SimpleXMLElement对象后再转换成数组,同样也可以将数组转SimpleXMLElement对象,再把SimpleXMLElement对象转换成XML数据。具体实现代码如下:
$data = [
[
'name' => 'cxx',
'age' => 30,
'email' => '1356415@example.com'
],
[
'name' => 'cxx',
'age' => 30,
'email' => '1356415@example.com',
'child' => [
'name' => 'cxx',
'age' => 30,
'email' => '1356415@example.com',
]
]
];
function arrToXml($arr,&$xmlObj){
foreach ($arr as $key => $value) {
if (is_array($value)){
if(is_int($key)){
$child = $xmlObj->addChild('root');
}else{
$child = $xmlObj->addChild($key);
}
arrToXml($value,$child);
continue;
}
$xmlObj->addChild($key,$value);
}
}
$xmlObj = new SimpleXMLElement('<root/>');
arrToXml($data,$xmlObj);
$output = $xmlObj->asXML();
echo $output;
打印的结果如下:
<?xml version="1.0"?>
<root><root><name>cxx</name><age>30</age><email>1356415@example.com</email></root><root><name>cxx</name><age>30</age><email>1356415@example.com</email><child><name>cxx</name><age>30</age><email>1356415@example.com</email></child></root></root>
上面的arrToXml函数是自己封装的,比较简单,还有很多情况没有考虑到,大家不要照抄哦
PHP除了SimpleXMLElement对象可以转换XML,还提供了一个DOMDocument对象操作XML,用法和SimpleXMLElement相似。
下面我们看看SimpleXMLElement的具体用法:
<?php
// 初始化SimpleXMLElement对象,参数是最顶层的xml标签
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>');
// 添加子XML标签到初始化的标签中间,例如:添加一个url标签
$urlElement = $xml->addChild('url');
//在url标签中添加其他标签
$urlElement->addChild('loc', '测试');
// 输出XML
$xml->asXML();
输出结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>测试</loc>
</url>
</urlset>
有遗漏或者不对的可以在我的公众号留言哦