php实现的数组转xml案例分析


Posted in PHP onSeptember 28, 2019

本文实例讲述了php实现的数组转xml。分享给大家供大家参考,具体如下:

0x00 需求

最近要做百度、360、神马搜索的网站sitemap,三家的格式都是xml,然而具体的细节还有有差别的。

一开始用的是dom,没有使用sax,写了几段便觉得太傻了,想到有没有数组转xml的库呢?

0x01 array2xml

搜索了一下,还真有地址为git,于是开始撸起袖子开始干。

示例如下:

THE CODE:

$xml = new ArrayToXML();
print $xml->buildXML($input);

INPUT:

$input = array('product' => array(
'@id' => 7,
'name' => 'some string',
'seo' => 'some-string',
'ean' => '',
'producer' => array(
'name' => null,
'photo' => '1.png'
),
'stock' => 123,
'trackstock' => 0,
'new' => 0,
'pricewithoutvat' => 1111,
'price' => 1366.53,
'discountpricenetto' => null,
'discountprice' => null,
'vatvalue' => 23,
'currencysymbol' => 'PLN',
'#description' => '',
'#longdescription' => '',
'#shortdescription' => '',
'category' => array(
'photo' => '1.png',
'name' => 'test3',
),
'staticattributes' => array(
'attributegroup' => array(
1 => array(
'@name' => 'attributes group',
'attribute' => array(
0 => array(
'name' => 'second',
'description' => 'desc2',
'file' => '',
),
1 =>
array(
'name' => 'third',
'description' => 'desc3',
'file' => '',
),
)
)
)
),
'attributes' => array(),
'photos' => array(
'photo' => array(
0 => array(
'@mainphoto' => '1',
'%' => '1.png',
),
1 => array(
'@mainphoto' => '0',
'%' => '2.png',
),
2 => array(
'@mainphoto' => '0',
'%' => '3.png',
)
)
)
));

OUTPUT (XML data):

<?xml version="1.0" encoding="UTF-8"?>
<data>
<product id="8">
<description><[CDATA[]]></description>
<longdescription><[CDATA[]]></longdescription>
<shortdescription><[CDATA[]]></shortdescription>
<name>some string</name>
<seo>some-string</seo>
<ean></ean>
<producer>
<name></name>
<photo>1.png</photo>
</producer>
<stock>123</stock>
<trackstock>0</trackstock>
<new>0</new>
<pricewithoutvat>1111</pricewithoutvat>
<price>1366.53</price>
<discountpricenetto></discountpricenetto>
<discountprice></discountprice>
<vatvalue>23</vatvalue>
<currencysymbol>PLN</currencysymbol>
<category>
<photo>1.png</photo>
<name>test3</name>
</category>
<staticattributes>
<attributegroup name="attributes group">
<attribute>
<name>second</name>
<description><p>desc2</p></description>
<file></file>
</attribute>
<attribute>
<name>third</name>
<description><p>desc3</p></description>
<file></file>
</attribute>
</attributegroup>
</staticattributes>
<photos>
<photo mainphoto="1">1.png</photo>
<photo mainphoto="0">2.png</photo>
<photo mainphoto="0">3.png</photo>
</photos>
</product>
</data>

可以看到,# 表示CDATA,@表示属性,%代表有属性时这个元素本身的值,非常简洁。
另外数组要把重复元素提到外面作为数组的key,重复元素的各种属性是数组的值,并不需要像上面那样指定 0、1、2索引,直接用就可以了。

0x02 改进

可是发现有一个bug,根节点不能以CDATA开始。

另外还缺少一个功能,CDATA和属性不能同时存在。

于是阅读源码,改进了这两项,提交给了作者,并被合并了。

我额外增加了一个符号 “!” ,当CDATA 和属性同时存在时,写法为:

$input = [
"key" =>[
"@id" => 1,
"!" => 2
]
]

<key id="1"><![CDATA[2]]></key>

PHP 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
PHP之COOKIE支持详解
Sep 20 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
非常经典的PHP文件上传类分享
May 15 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
Laravel模型事件的实现原理详解
Mar 14 PHP
使用laravel指定日志文件记录任意日志
Oct 17 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
PHP反射原理与用法深入分析
Sep 28 #PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 #PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 #PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 #PHP
PHP的cookie与session原理及用法详解
Sep 27 #PHP
PHP下载文件函数与用法示例
Sep 27 #PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 #PHP
You might like
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
咖啡的化学
2021/03/03 咖啡文化
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
再探JavaScript作用域
2014/09/24 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python常用特殊方法实例总结
2019/03/22 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
对python中各个response的使用说明
2020/03/28 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
请介绍一下Ant
2016/07/22 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
关于母亲节的感言
2014/02/04 职场文书
个人安全承诺书
2014/05/22 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
计算机实训心得体会
2016/01/14 职场文书
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript