php xml转数组,new DOMDocument 转数组

php教程9年前 (2016-10-19)22230

php xml转数组,new DOMDocument 转数组

一:方法

/**
 *
 * 将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;
}

二:方法调用

$xml = new DOMDocument();
$xml->load($url); //读取xml文件
$result = domNodeToArray($xml);  
$result = $result['#document'];
var_dump($result);
exit;

三:转换后形式

示例:

 

<?xml version="1.0"?>

<root>

<User>

<UserGUID>123456</UserGUID>

<NickName>[email protected]</NickName>

</User>

</root>

 

转换成数组后的形式是:

 

 

Array

(

    [root] => Array

        (

            [User] => Array

                (

                    [UserGUID] => 123456

                    [NickName] => [email protected]

                )

 

        )

 

)

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。