xml转数组的方法

来源:互联网 发布:香港php虚拟主机 编辑:程序博客网 时间:2024/04/29 20:06

转自,特别表示感谢,解决了我很大的问题http://isblog.blog.163.com/blog/static/724167520116241635526/


xml转数组的方法  

2011-07-24 01:16:24|  分类: PHP学习|举报|字号 订阅

前言: 有时因项目需要,在调用别人接口时返回xml格式的内容,这时需要处理xml数据并写入数据库中,因个人技术有限开始很纠结,后面发现已有高手写出了怎么一个方法,看了很不错。(收藏了~~)
第一种简单方法:
/**  
* xml转数组方法 *  
* @param xml $xml xml格式字符串 
* @param boolean $recursive 是否解释一串XML入一个对象中  
* @return array  
*/ 
function XML2Array ( $xml , $recursive = false ) {  
if ( ! $recursive ){  
$tmpData = simplexml_load_string ( $xml ) ;  
}else{  
$tmpData = $xml ;  
}  
$newArray = array () ;  
foreach ( $tmpData as $key => $value ){  
$value = ( array ) $value ;  
if ( isset ( $value [ 0 ] ) && ! is_object ( $value [ 0 ] ) ){  
$newArray [ $key ] = trim ( $value [ 0 ] ) ;  
}else{  
$newArray [ $key ] = XML2Array ( $value , true ) ;  
}  
}  
return $newArray ;
}
解析xml格式如下:
$str=<<<XML
<?xml version="1.0" ?>
<library>
    <book>
        <ddd>swwss</ddd>
        <ddd id="y7" dd='yy'>
            <dd>ccc</dd>
        </ddd>
    </book>
    <return>
      <name>lin</name>
      <age>44</age>
    </return>
    <return>
      <name>lin2</name>
      <age>45</age>
    </return>
</library>
XML;

对如下格式解析不出属性:
<ddd id="y7" dd='yy'>swwss</ddd>

第二种复杂方法:
function simplexml4array($xmle){
  $haschildren=false;
  foreach($xmle->attributes() as $k=>$c)
  {
    $r[$xmle->getName()]['@att'][$k]=(string)$c;//保存属性值
  }
  foreach($xmle->children() as $k=>$c)
  {
    $haschildren=true;
    $res = simplexml4array($c);
    if(!empty($res)){
        $r[$xmle->getName()][]=$res;
    }
  }
  if(!$haschildren)
  {
      $str=(string)$xmle;
      if(!empty($str)){
          $r[$xmle->getName()]['@txt']=(string)$xmle;//保存文本值 
      }
  }
  return $r;
}
//附上一个测试的例子
$str=<<<XML
<?xml version="1.0" ?>
<library>
    <book>
        <ddd id="x6" dd="xx">swwss</ddd>
        <ddd id="y7" dd='yy'>
            <dd>ccc</dd>
        </ddd>
    </book>
    <return>
      <name>lin</name>
      <age>44</age>
    </return>
    <return>
      <name>lin2</name>
      <age>45</age>
    </return>
</library>
XML;

$xml = simplexml_load_string($str);
$arr = simplexml4array($xml);
print_r($arr);

下面是得到的数组,有些人认为数组里有下标[0]、[1]等之类的是多余的(开始我也怎么认为),后面经测试这样做是出现相同的标签时区分开多个。如测试的例子中就验证了这一点,因为有时xml要返回多条值,而为了得到这些值它们之间就需要使用下标来区分。
输出数组格式:
  • Array
  • (
  •     [library] => Array
  •         (
  •             [0] => Array
  •                 (
  •                     [book] => Array
  •                         (
  •                             [0] => Array
  •                                 (
  •                                     [ddd] => Array
  •                                         (
  •                                             [@att] => Array
  •                                                 (
  •                                                     [id] => x6
  •                                                     [dd] => xx
  •                                                 )
  •                                             [@txt] => swwss
  •                                         )
  •                                 )
  •                             [1] => Array
  •                                 (
  •                                     [ddd] => Array
  •                                         (
  •                                             [@att] => Array
  •                                                 (
  •                                                     [id] => y7
  •                                                     [dd] => yy
  •                                                 )
  •                                             [0] => Array
  •                                                 (
  •                                                     [dd] => Array
  •                                                         (
  •                                                             [@txt] => ccc
  •                                                         )
  •                                                 )
  •                                         )
  •                                 )
  •                         )
  •                 )
  •             [1] => Array
  •                 (
  •                     [return] => Array
  •                         (
  •                             [0] => Array
  •                                 (
  •                                     [name] => Array
  •                                         (
  •                                             [@txt] => lin
  •                                         )
  •                                 )
  •                             [1] => Array
  •                                 (
  •                                     [age] => Array
  •                                         (
  •                                             [@txt] => 44
  •                                         )
  •                                 )
  •                         )
  •                 )
  •             [2] => Array
  •                 (
  •                     [return] => Array
  •                         (
  •                             [0] => Array
  •                                 (
  •                                     [name] => Array
  •                                         (
  •                                             [@txt] => lin2
  •                                         )
  •                                 )
  •                             [1] => Array
  •                                 (
  •                                     [age] => Array
  •                                         (
  •                                             [@txt] => 45
  •                                         )
  •                                 )
  •                         )
  •                 )
  •         )
  • )

原文地址:http://bbs.chinaunix.net/thread-808855-1-1.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 20个月宝宝腿不直小腿外八怎么办 小孩手青枝骨骨折拆石膏还弯怎么办 宝宝喝柴胡注射剂有不良反应怎么办 九个月宝宝便秘拉不出来怎么办 一岁四个月的宝宝便秘怎么办 热血三国3要塞打不过去怎么办 清香木夏天有黄叶和掉叶怎么办 生完宝宝妊娠纹还在继续疯长怎么办 陌陌不能最小化观看直播视频怎么办 苏州园区公积金密码忘记了怎么办 房产企业申请破产买的房子怎么办 被业务员骗了买了保险怎么办 孩子特别害怕老师严厉的批评怎么办 4k电视看有线电视不清晰怎么办 移动9.9流量4g网用完了怎么办 东方头条验证码已经被注册了怎么办 打王者两个人吵架被夹在中间怎么办 顾客拿过期的食品过来投诉怎么办 老婆总是埋怨我父母我该怎么办? 代款公司如果使用暴力追债怎么办 法院拍卖款分配有疑意怎么办 法院拍卖买到的房子里有户口怎么办 新注册手机邮箱不和电脑同步怎么办 移动4g盒当月流量封顶怎么办 昆仑加油卡密码忘记了怎么办 昆仑银行e盾密码忘记了怎么办 中石化加油卡密码忘记了怎么办 壳牌加油卡密码忘了怎么办 中国石化加油卡密码忘了怎么办 中石化加油卡密码忘了怎么办 中石化加油卡需要密码忘了怎么办 求不熟领导办事送礼不收怎么办 送礼给领导不收好像很生气怎么办 加油卡没有密码加油后锁住怎么办 个人怎么办中石化油卡怎么开公司票 中石化副卡挂失后钱怎么办 中石化的加油卡丢了怎么办 得仕卡过期3年了怎么办 如果在超市买到过期商品怎么办 华润万家买的豆干过期了吃了怎么办 华润万家购物卡过期了怎么办