<? 
 
// {{{ toString() 
/** 
 * This method converts a file to a string. It returns an Error object if it is unable to open the file. 
 * 
 * @param    fileName String. The name of the file to convert. 
 * 
 * @return    String 
 * @author  simgar 
 */ 
 
function toString( $fileName ) 
{ 
    if ($content_array = file($fileName)) 
    { 
        return implode("", $content_array); 
    } 
    else 
    { 
        // Error 
        return false; 
    } 
} 
// }}} 
 
// {{{ xmlFileToArray() 
/** 
 * This static method converts an xml file to an associative array  
 * duplicating the xml file structure. 
 * 
 * @param    $fileName. String. The name of the xml file to convert.  
 *             This method returns an Error object if this file does not  
 *             exist or is invalid. 
 * @param    $includeTopTag. boolean. Whether or not the topmost xml tag  
 *             should be included in the array. The default value for this is false. 
 * @param    $lowerCaseTags. boolean. Whether or not tags should be  
 *            set to lower case. Default value for this parameter is true. 
 * @access    public static 
 * @return    Associative Array 
 * @author    Jason Read <[email protected]> 
 */ 
function xmlFileToArray($fileName, $includeTopTag = false, $lowerCaseTags = true) 
{ 
    // Definition file not found 
    if (!file_exists($fileName)) 
    { 
        // Error 
        return false; 
    } 
    $p = xml_parser_create(); 
    xml_parse_into_struct($p,toString($fileName),$vals,$index); 
    xml_parser_free($p); 
    $xml = array(); 
    $levels = array(); 
    $multipleData = array(); 
    $prevTag = ""; 
    $currTag = ""; 
    $topTag = false; 
    foreach ($vals as $val) 
    { 
        // Open tag 
        if ($val["type"] == "open") 
        { 
            if (!_xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags, 
                                           $levels, $prevTag, $multipleData, $xml)) 
            { 
                continue; 
            } 
        } 
        // Close tag 
        else if ($val["type"] == "close") 
        { 
            if (!_xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags, $currTag, 
                                            $levels, $prevTag, $multipleData, $xml)) 
            { 
                continue; 
            } 
        } 
        // Data tag 
        else if ($val["type"] == "complete" && isset($val["value"])) 
        { 
            $loc =& $xml; 
            foreach ($levels as $level) 
            { 
                $temp =& $loc[str_replace(":arr#", "", $level)]; 
                $loc =& $temp; 
            } 
            $tag = $val["tag"]; 
            if ($lowerCaseTags) 
            { 
                $tag = strtolower($val["tag"]); 
            } 
            $loc[$tag] = str_replace("\\n", "\n", $val["value"]); 
        } 
        // Tag without data 
        else if ($val["type"] == "complete") 
        { 
            _xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags, $currTag, 
                                      $levels, $prevTag, $multipleData, $xml); 
            _xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags, $currTag,  
                                      $levels, $prevTag, $multipleData, $xml); 
        } 
    } 
    return $xml; 
} 
// }}} 
 
// {{{ _xmlFileToArrayOpen() 
/** 
 * Private support function for xmlFileToArray. Handles an xml OPEN tag. 
 * 
 * @param    $topTag. String. xmlFileToArray topTag variable 
 * @param    $includeTopTag. boolean. xmlFileToArray includeTopTag variable 
 * @param    $val. String[]. xmlFileToArray val variable 
 * @param    $currTag. String. xmlFileToArray currTag variable 
 * @param    $lowerCaseTags. boolean. xmlFileToArray lowerCaseTags variable 
 * @param    $levels. String[]. xmlFileToArray levels variable 
 * @param    $prevTag. String. xmlFileToArray prevTag variable 
 * @param    $multipleData. boolean. xmlFileToArray multipleData variable 
 * @param    $xml. String[]. xmlFileToArray xml variable 
 * @access    private static 
 * @return    boolean 
 * @author    Jason Read <[email protected]> 
 */ 
function _xmlFileToArrayOpen(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags,  
                             & $levels, & $prevTag, & $multipleData, & $xml) 
{ 
    // don't include top tag 
    if (!$topTag && !$includeTopTag) 
    { 
        $topTag = $val["tag"]; 
        return false; 
    } 
    $currTag = $val["tag"]; 
    if ($lowerCaseTags) 
    { 
        $currTag = strtolower($val["tag"]); 
    } 
    $levels[] = $currTag; 
     
    // Multiple items w/ same name. Convert to array. 
    if ($prevTag === $currTag) 
    { 
        if (!array_key_exists($currTag, $multipleData) ||  
            !$multipleData[$currTag]["multiple"]) 
        { 
            $loc =& $xml; 
            foreach ($levels as $level) 
            { 
                $temp =& $loc[$level]; 
                $loc =& $temp; 
            } 
            $loc = array($loc); 
            $multipleData[$currTag]["multiple"] = true; 
            $multipleData[$currTag]["multiple_count"] = 0; 
        } 
        $multipleData[$currTag]["popped"] = false; 
        $levels[] = ":arr#" . ++$multipleData[$currTag]["multiple_count"]; 
    } 
    else 
    { 
        $multipleData[$currTag]["multiple"] = false; 
    } 
     
    // Add attributes array 
    if (array_key_exists("attributes", $val)) 
    { 
        $loc =& $xml; 
        foreach ($levels as $level) 
        { 
            $temp =& $loc[str_replace(":arr#", "", $level)]; 
            $loc =& $temp; 
        } 
        $keys = array_keys($val["attributes"]); 
        foreach ($keys as $key) 
        { 
            $tag = $key; 
            if ($lowerCaseTags) 
            { 
                $tag = strtolower($tag); 
            } 
            $loc["attributes"][$tag] = & $val["attributes"][$key]; 
        } 
    } 
    return true; 
} 
// }}} 
 
// {{{ _xmlFileToArrayClose() 
/** 
 * Private support function for xmlFileToArray. Handles an xml OPEN tag. 
 * 
 * @param    $topTag. String. xmlFileToArray topTag variable 
 * @param    $includeTopTag. boolean. xmlFileToArray includeTopTag variable 
 * @param    $val. String[]. xmlFileToArray val variable 
 * @param    $currTag. String. xmlFileToArray currTag variable 
 * @param    $lowerCaseTags. boolean. xmlFileToArray lowerCaseTags variable 
 * @param    $levels. String[]. xmlFileToArray levels variable 
 * @param    $prevTag. String. xmlFileToArray prevTag variable 
 * @param    $multipleData. boolean. xmlFileToArray multipleData variable 
 * @param    $xml. String[]. xmlFileToArray xml variable 
 * @access    private static 
 * @return    boolean 
 * @author    Jason Read <[email protected]> 
 */ 
function _xmlFileToArrayClose(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags,& $currTag,  
                              & $levels, & $prevTag, & $multipleData, & $xml) 
{ 
    // don't include top tag 
    if ($topTag && !$includeTopTag && $val["tag"] == $topTag) 
    { 
        return false; 
    } 
    if ( 
            (!is_array($currTag)) 
        && 
            (count($multipleData)>0) 
        && 
        isset($multipleData[$currTag]) 
        && 
        ($multipleData[$currTag]["multiple"]) 
    ) 
    { 
        $tkeys = array_reverse(array_keys($multipleData)); 
        foreach ($tkeys as $tkey) 
        { 
            if ($multipleData[$tkey]["multiple"] && !$multipleData[$tkey]["popped"]) 
            { 
                array_pop($levels); 
                $multipleData[$tkey]["popped"] = true; 
                break; 
            } 
            else if (!$multipleData[$tkey]["multiple"]) 
            { 
                break; 
            } 
        } 
    } 
    $prevTag = array_pop($levels); 
    if (strpos($prevTag, "arr#")) 
    { 
        $prevTag = array_pop($levels); 
    } 
    return true; 
} 
// }}} 
?> 
 
 |