今天项目需要用到生成xml日志,种类比较多,果断自己写了个,在处理结束时,有点费力,贴出来分享一下,如果有什么错误,请指正:
测试数据:
$data = array(‘books‘,array(‘book‘,
array(‘bookname‘,‘平凡的世界‘),
array(‘author‘,‘路遥‘),
array(‘pubdate‘,‘2009年‘),
array(‘info‘,array(‘Name‘=>‘About‘),‘1991年3月《平凡的世界》获中国第三届茅盾文学奖‘),
),array(‘book‘,
array(‘bookname‘,‘活着‘),
array(‘author‘,‘余华‘),
array(‘pubdate‘,‘1994年‘),
array(‘info‘,array(‘Name‘=>‘About‘),‘1994年由张艺谋执导,葛优、巩俐等主演‘)
)
);
/**
* 创建日志XML文件
*
* @param $data array 生成的XML的源数据
*
* 数据格式定义约束:
* 1. 数据节点出现的层次必须跟xml节点的层次一致
* 2. 节点属性必须跟所在的节点在同一层次,但是节点作为第一个元素出现,属性节点作为后继元素出现
*
* demo: array(‘InstallationLog‘,
* array(‘HostIp‘,array(),‘192.168.1.107‘),
* array(‘ComputerName‘,array(),‘bGlwZW5nLXh5LUwx‘),
* array(‘OrderID‘,array(),‘R0RBWi04MTVTLTUwOTktM1JSRA==‘),
* array(‘UserData‘,array(‘Name‘=>‘SoftwareID‘),‘0‘),
* array(‘LogType‘,array(),‘0‘),
* array(‘Time‘,array(),‘2014-06-13 18:14:46‘),
* array(‘UTCMs‘,array(),‘1402654506172‘)
* )
*
* <?xml version="1.0" encoding="utf-8"?>
* <InstallationLog>
* <HostIp>192.168.1.107</HostIp>
* <ComputerName>bGlwZW5nLXh5LUwx</ComputerName>
* <OrderID>R0RBWi04MTVTLTUwOTktM1JSRA==</OrderID>
* <UserData Name="SoftwareID">0</UserData>
* <LogType>0</LogType>
* <Time>2014-06-13 18:14:46</Time>
* <UTCMs>1402654506172</UTCMs>
* </InstallationLog>
*
* @return string 生成的xml文件
*/
function createLogXmlFile(array $data,$isOnlyRoot=false){
static $xml;
static $outerLen = 0;
static $count = 0;
if(!$xml){
$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndentString(‘ ‘);
$xml->setIndent(true);
$xml->startDocument(‘1.0‘, ‘utf-8‘);
}
$length = count($data);
if($outerLen === 0){
$outerLen = $length;
}
for($i=0; $i<$length; $i++){
if(is_array($data[$i]) && $data){
if(count($data[$i]) === 1){
$attr_n = array_shift(array_keys($data[$i]));
$attr_v = array_shift(array_values($data[$i]));
$xml->writeAttribute($attr_n,$attr_v);
}else{
createLogXmlFile($data[$i]);
}
}else{
if($i == 0){
$xml->startElement($data[$i]);
}else{
$xml->text($data[$i]);
}
}
if($i === $length-1){
if($isOnlyRoot){
$xml->endElement();
$xml->endDocument();
return $xml->outputMemory(false);
}else{
if(is_array($data[$i])){
$count++;
if($count === $outerLen){
$xml->endDocument();
return $xml->outputMemory(false);
}
}
$xml->endElement();
}
}
}
}
自定义数组转换成xml