| 
<?
 // {{{ 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;
 }
 // }}}
 ?>
 
 |