转自,特别表示感谢,解决了我很大的问题http://isblog.blog.163.com/blog/static/724167520116241635526/
前言: 有时因项目需要,在调用别人接口时返回xml格式的内容,这时需要处理xml数据并写入数据库中,因个人技术有限开始很纠结,后面发现已有高手写出了怎么一个方法,看了很不错。(收藏了~~)
第一种简单方法:
第二种复杂方法:
function simplexml4array($xmle){
第一种简单方法:
/**
* 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要返回多条值,而为了得到这些值它们之间就需要使用下标来区分。
输出数组格式:
下面是得到的数组,有些人认为数组里有下标[0]、[1]等之类的是多余的(开始我也怎么认为),后面经测试这样做是出现相同的标签时区分开多个。如测试的例子中就验证了这一点,因为有时xml要返回多条值,而为了得到这些值它们之间就需要使用下标来区分。
输出数组格式:
- @H_419_301@Array
- @H_419_301@(
- @H_419_301@ [library] => Array
- @H_419_301@ (
- @H_419_301@ [0] => Array
- @H_419_301@ (
- @H_419_301@ [book] => Array
- @H_419_301@ (
- @H_419_301@ [0] => Array
- @H_419_301@ (
- @H_419_301@ [ddd] => Array
- @H_419_301@ (
- @H_419_301@ [@att] => Array
- @H_419_301@ (
- @H_419_301@ [id] => x6
- @H_419_301@ [dd] => xx
- @H_419_301@ )
- @H_419_301@ [@txt] => swwss
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ [1] => Array
- @H_419_301@ (
- @H_419_301@ [ddd] => Array
- @H_419_301@ (
- @H_419_301@ [@att] => Array
- @H_419_301@ (
- @H_419_301@ [id] => y7
- @H_419_301@ [dd] => yy
- @H_419_301@ )
- @H_419_301@ [0] => Array
- @H_419_301@ (
- @H_419_301@ [dd] => Array
- @H_419_301@ (
- @H_419_301@ [@txt] => ccc
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ [1] => Array
- @H_419_301@ (
- @H_419_301@ [return] => Array
- @H_419_301@ (
- @H_419_301@ [0] => Array
- @H_419_301@ (
- @H_419_301@ [name] => Array
- @H_419_301@ (
- @H_419_301@ [@txt] => lin
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ [1] => Array
- @H_419_301@ (
- @H_419_301@ [age] => Array
- @H_419_301@ (
- @H_419_301@ [@txt] => 44
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ [2] => Array
- @H_419_301@ (
- @H_419_301@ [return] => Array
- @H_419_301@ (
- @H_419_301@ [0] => Array
- @H_419_301@ (
- @H_419_301@ [name] => Array
- @H_419_301@ (
- @H_419_301@ [@txt] => lin2
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ [1] => Array
- @H_419_301@ (
- @H_419_301@ [age] => Array
- @H_419_301@ (
- @H_419_301@ [@txt] => 45
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@ )
- @H_419_301@)