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数组转xml的更多相关文章

  1. PHP中数组转换为XML格式

    最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个. <?php /** * ...

  2. php数组转xml的递归实现

    原文:php数组转xml的递归实现 PHP中奖数组转为xml的需求是常见的,而且实现方法也有很多种,百度找了一下各种实现方法,但是基本是借组一些组件啥的.我就自己写了一个字符串拼组的方法,支持多维数组 ...

  3. PHP数组和XML相互转换的函数

    //数组转xml function ArrToXml($arr) { if(!is_array($arr) || count($arr) == 0) return ''; $xml = "& ...

  4. 数组转xml格式/xml格式转数组

    数组转xml格式 $arr=array( 'username'=>'huahua', 'password'=>'123456', 'number'=>'15889652911', ) ...

  5. php xml转数组,数组转xml,array转xml,xml转array

    //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...

  6. PHP数组与xml互相转换

    1.数组转xml function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key => $va ...

  7. PowerShell 数组以及XML操作

    PowerShell基础 PowerShell数组操作 将字符串拆分成数据的操作 cls #原始字符串 $str = "abc,def,ghi,mon" #数据定义 #$StrAr ...

  8. 使用php将数组转为XML

    <?php class Array_to_Xml { private $version = '1.0'; private $encoding = 'UTF-8'; private $root = ...

  9. json 数组 对象 xml 之间转换(待补充)

    json 数组  xml 对象   之间转换(待补充) 1 把对象的类型或者数组转换成字符串类型(或者更确切的说是json类型的). 此处参考链接http://www.jb51.net/article ...

随机推荐

  1. 解决方案,org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    org.hibernate.LazyInitializationException: could not initialize proxy - no Session org.hibernate.pro ...

  2. Markdown 轻量级标记语言

    1.Markdown 语言 1.1 Markdown 简介 Markdown 是一种轻量级的标记语言,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷 ...

  3. spring-data-redis读写分离

    在对Redis进行性能优化时,一直想对Redis进行读写分离.但由于项目底层采用spring-data-redis对redis进行操作,参考spring官网却发现spring-data-redis目前 ...

  4. Eclipse中Ant的配置与测试

    在Eclipse中使用Ant Ant是Java平台下非常棒的批处理命令执行程序,能非常方便地自动完成编译,测试,打包,部署等等一系列任务,大大提高开发效率.如果你现在还没有开始使用Ant,那就要赶快开 ...

  5. Oracle 12C -- 使用local PDB克隆新的PDB

    1.将用于克隆的PDB至于只读状态:startup open read only SQL> select con_id,name,open_mode from v$pdbs; CON_ID NA ...

  6. Inondb中的checkpoint

    checkpoint主要是为了解决一下问题: 1.缩短数据库的恢复时间 2.缓冲池不够用时,将脏页刷新到磁盘 3.重做日志不可用时,刷新脏页 Innodb引擎使用LSN(log sequence nu ...

  7. session的取代者:Json Web Tokens----在客户端存储登陆状态

    https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

  8. Qt Creator中如何添加C++0x支持

    最近在学习多线程编程,本人平时习惯使用Qt Creator写程序,只是作为C++编辑器,很少使用Qt library中的类. Multi Threading作为C++11标准已经纳入C++标准库了,可 ...

  9. css ::selection 的妙用

    1.选中页面文字和元素时的背景颜色 ::selection { background: #25b864; color: #fff; } 2.不能选择页面内容(但可以拖拽内容进行复制.挺好玩的) ::s ...

  10. 史上最简单的 GitHub 教程

    史上最简单的 GitHub 教程 温馨提示:本系列博文已经同步到 GitHub,如有需要的话,欢迎大家到「github-tutorial」进行Star和Fork操作! 1 简介 GitHub 是一个面 ...