php操作xml(2)

来源:互联网 发布:网络活动策划方案 编辑:程序博客网 时间:2024/05/20 12:46

在上一篇文章中由xml和数组之间的转换是没有涉及到xml属性的,只是xml的值和数组之间的转换

那么如果xml中有值也有属性,又该怎么办呢,请看下面的介绍(本文章只介绍xml转换为数组)

比如过你的xml为:

<?xml version="1.0" encoding="utf-8"?><phplamp key="5"><post key="x"><title id="1">PHP XML处理介绍一</title><details>详细内容一</details></post><post key="y"><title id="2">PHP XML处理介绍二 </title><details key="5">详细内容二 </details></post><post key="z"><title id="3">PHP XML处理介绍三</title><details>详细内容三</details></post></phplamp>


那么该怎么样转换成数组呢,如果还用上一篇文章中的方法就不行了(不过上一篇文章的xml可以用本文章的方法哦)

如果让上面的xml转换成数组,需要用到以下函数

function xml2array($xml) {$arXML=array();$arXML['name']=trim($xml->getName());$arXML['value']=trim((string)$xml);$t=array();foreach($xml->attributes() as $name => $value){$t[$name]=trim($value);}$arXML['attr']=$t;$t=array();foreach($xml->children() as $name => $xmlchild) {$t[$name][]=xml2array($xmlchild);}$arXML['children']=$t;return($arXML);}


具体用法代码如下:

$xml = simplexml_load_string($xml);$xmlArr = xml2array($xml);dump($xmlArr);


打印出来$xmlArr的结构如下:

array(4) {  ["name"] => string(7) "phplamp"  ["value"] => string(0) ""  ["attr"] => array(1) {    ["key"] => string(1) "5"  }  ["children"] => array(1) {    ["post"] => array(3) {      [0] => array(4) {        ["name"] => string(4) "post"        ["value"] => string(0) ""        ["attr"] => array(1) {          ["key"] => string(1) "x"        }        ["children"] => array(2) {          ["title"] => array(1) {            [0] => array(4) {              ["name"] => string(5) "title"              ["value"] => string(22) "PHP XML处理介绍一"              ["attr"] => array(1) {                ["id"] => string(1) "1"              }              ["children"] => array(0) {              }            }          }          ["details"] => array(1) {            [0] => array(4) {              ["name"] => string(7) "details"              ["value"] => string(15) "详细内容一"              ["attr"] => array(0) {              }              ["children"] => array(0) {              }            }          }        }      }      [1] => array(4) {        ["name"] => string(4) "post"        ["value"] => string(0) ""        ["attr"] => array(1) {          ["key"] => string(1) "y"        }        ["children"] => array(2) {          ["title"] => array(1) {            [0] => array(4) {              ["name"] => string(5) "title"              ["value"] => string(22) "PHP XML处理介绍二"              ["attr"] => array(1) {                ["id"] => string(1) "2"              }              ["children"] => array(0) {              }            }          }          ["details"] => array(1) {            [0] => array(4) {              ["name"] => string(7) "details"              ["value"] => string(15) "详细内容二"              ["attr"] => array(1) {                ["key"] => string(1) "5"              }              ["children"] => array(0) {              }            }          }        }      }      [2] => array(4) {        ["name"] => string(4) "post"        ["value"] => string(0) ""        ["attr"] => array(1) {          ["key"] => string(1) "z"        }        ["children"] => array(2) {          ["title"] => array(1) {            [0] => array(4) {              ["name"] => string(5) "title"              ["value"] => string(22) "PHP XML处理介绍三"              ["attr"] => array(1) {                ["id"] => string(1) "3"              }              ["children"] => array(0) {              }            }          }          ["details"] => array(1) {            [0] => array(4) {              ["name"] => string(7) "details"              ["value"] => string(15) "详细内容三"              ["attr"] => array(0) {              }              ["children"] => array(0) {              }            }          }        }      }    }  }}


你可以自己去分析该数组结构,这里我就不做分析了

附:上面的输出格式是属于一种浏览器友好输出格式,挺方便浏览的,可以作为参考

代码如下:

function dump($var, $echo=true, $label=null, $strict=true) {$label = ($label === null) ? '' : rtrim($label) . ' ';if (!$strict) {if (ini_get('html_errors')) {$output = print_r($var, true);$output = "<pre>" . $label . htmlspecialchars($output, ENT_QUOTES) . "</pre>";} else {$output = $label . print_r($var, true);}} else {ob_start();var_dump($var);$output = ob_get_clean();if (!extension_loaded('xdebug')) {$output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';}}if ($echo) {echo($output);return null;}elsereturn $output;}