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边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
php 远程关机操作的代码
Dec 05 PHP
PHP 批量更新网页内容实现代码
Jan 05 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
PHP之密码加密的几种方式
Jul 29 PHP
6个超实用的PHP代码片段
Aug 10 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
php 的反射详解及示例代码
Aug 25 PHP
php中Redis的应用--消息传递
Mar 28 PHP
在laravel框架中使用model层的方法
Oct 08 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
javascript打开word文档的方法
2014/04/16 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
python和c语言的主要区别总结
2019/07/07 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Python 如何测试文件是否存在
2020/07/31 Python
基于Python实现天天酷跑功能
2021/01/06 Python
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
幼儿园八一建军节活动方案
2014/08/27 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
大学运动会通讯稿
2015/07/18 职场文书
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript