PHP解析XML数据及数组转xml

简介: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>

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1