自定义数组转换成xml

今天项目需要用到生成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

时间: 2024-10-13 16:31:24

自定义数组转换成xml的相关文章

php数组转换成xml格式数据

function arrayToXml($arr){     $xml = "<root>";     foreach ($arr as $key=>$val){     if(is_array($val)){     $xml.="<".$key.">".arrayToXml($val)."</".$key.">";     }else{     $xml.=&q

第 5 章 微信开发之解析微信服务器传来的消息以及将响应消息转换成xml返回给微信服务器

/** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO 消息的接收.处理.响应 } doPost方法有两个参数: 1.request中封装了请求相关的所有内容,可以从request中取出微信服务器发来的消息: 2.response我们可以对接收到的消息进行响应,即

map对象转换成xml

1. @XmlAccessorOrder.UNDEFINEDXmlAccessorOrder.UNDEFINED无序   @XmlAccessorOrder.ALPHABETICAL是指按属性的字母顺序排序. 2. @XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错   @XmlType(propOrder = { "id", "name", "age","book"})指定输出

LeetCode OJ:Convert Sorted Array to Binary Search Tree(将排序好的数组转换成二叉搜索树)

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 讲一个排序好的数组转换成二叉搜索树,这题没想出来,基本上是参考别人的,边界条件应该注意一下: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * T

c#程序将excel文件转换成xml文件

要程序你自己去组装去,我只写两个部分,一个是读Excel的部分,然后是写入到xml的1) 从指定的excel读出信息string strConn="provider=Microsoft.Jet.OLEDB.4.0;data source=你的Excel文件.xls;Extended Properties=Excel 8.0;";DataSet ds=new DataSet();System.Data.OleDb.OleDbConnection oleConn=new System.Da

数组转换成集合

package com.loaderman.jdk5; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Demo4_AsList { /** * 数组转换成集合 * 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法 */ public static void main(String[] args) { //demo1

java的byte数组转换成在[0,255]范围内

C#的byte    是 0-255java的byte  是 -128-127  java的byte数组转换成在[0,255]范围内int data[]= new int[bytes.length];for(int i=0;i<bytes.length;i++) { data[i] = bytes[i] & 0xff;}

javabean转换成xml(XStream)小工具

1 package cn.itcast.demo1; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.junit.Test; 7 8 import com.thoughtworks.xstream.XStream; 9 10 /** 11 * 演示XStream 12 * @author cxf 13 * 14 */ 15 public class Demo1 { 16 // 返回javabean集合

【第3篇】通过JSON-Lib把数组转换成Json数据

package ivyy.taobao.com.domain.jsonlib; import ivyy.taobao.com.entity.Address; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** *@DEMO:j