php xml解析转数组

/** 
 *  
 * 将xml转为数组 
 * @param string $xml xml字符串 
 * @param string $version xml版本 
 * @param string $charset xml编码 
 */  
function xmlToArray($xml, $version="1.0", $charset="utf-8"){  
    $doc = new DOMDocument ("1.0", $charset);  
    $doc->loadXML ($xml);  
    $result = domNodeToArray($doc);  
    if(isset($result['#document'])){  
        $result = $result['#document'];  
    }  
    return $result;  
}  
/** 
 *  
 * 将domNode转为数组 
 * @param DOMNode $oDomNode 
 */  
function domNodeToArray(DOMNode $oDomNode = null) {  
    // return empty array if dom is blank  
    if (! $oDomNode->hasChildNodes ()) {  
        $mResult = $oDomNode->nodeValue;  
    } else {  
        $mResult = array ();  
        foreach ( $oDomNode->childNodes as $oChildNode ) {  
            // how many of these child nodes do we have?  
            // this will give us a clue as to what the result structure should be  
            $oChildNodeList = $oDomNode->getElementsByTagName ( $oChildNode->nodeName );  
            $iChildCount = 0;  
            // there are x number of childs in this node that have the same tag name  
            // however, we are only interested in the # of siblings with the same tag name  
            foreach ( $oChildNodeList as $oNode ) {  
                if ($oNode->parentNode->isSameNode ( $oChildNode->parentNode )) {  
                    $iChildCount ++;  
                }  
            }  
            $mValue = domNodeToArray ( $oChildNode );  
            $sKey = ($oChildNode->nodeName {0} == '#') ? 0 : $oChildNode->nodeName;  
            $mValue = is_array ( $mValue ) ? $mValue [$oChildNode->nodeName] : $mValue;  
            // how many of thse child nodes do we have?  
            if ($iChildCount > 1) { // more than 1 child - make numeric array  
                $mResult [$sKey] [] = $mValue;  
            } else {  
                $mResult [$sKey] = $mValue;  
            }  
        }  
        // if the child is <foo>bar</foo>, the result will be array(bar)  
        // make the result just 'bar'  
        if (count ( $mResult ) == 1 && isset ( $mResult [0] ) && ! is_array ( $mResult [0] )) {  
            $mResult = $mResult [0];  
        }  
    }  
    // get our attributes if we have any  
    $arAttributes = array ();  
    if ($oDomNode->hasAttributes ()) {  
        foreach ( $oDomNode->attributes as $sAttrName => $oAttrNode ) {  
            // retain namespace prefixes  
            $arAttributes ["@{$oAttrNode->nodeName}"] = $oAttrNode->nodeValue;  
        }  
    }  
    // check for namespace attribute - Namespaces will not show up in the attributes list  
    if ($oDomNode instanceof DOMElement && $oDomNode->getAttribute ( 'xmlns' )) {  
        $arAttributes ["@xmlns"] = $oDomNode->getAttribute ( 'xmlns' );  
    }  
    if (count ( $arAttributes )) {  
        if (! is_array ( $mResult )) {  
            $mResult = (trim ( $mResult )) ? array ($mResult ) : array ();  
        }  
        $mResult = array_merge ( $mResult, $arAttributes );  
    }  
    $arResult = array ($oDomNode->nodeName => $mResult );  
    return $arResult;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值