<?
/**
@file xml.php
@class XML.
XML Parser class.
This class changes php arrays into xml text and vice versa.
*/
final class XML
{
//-------------------------------------------------------------------
/**
XML to Array.
Converts the XML text that was generated by this class to an array.
It can work with unidimensional and multidimensional associative arrays.
@param arg_str_xml The xml text to be changed into an array.
@return Array.
@see prv_xml_to_array().
*/
public function xml_to_array($arg_str_xml)
{
$parser = xml_parser_create();
xml_parse_into_struct($parser, $arg_str_xml, $arr_raw_xml);
$arr_out = array();
$this->prv_xml_to_array($arr_raw_xml, $arr_out);
return $arr_out;
} // end function xml_to_array
//-----------------------------------------------------------------------------
/**
Private XML to Array.
Converts xml to array recursively.
@param arg_tags the raw array of tags got from xml_parse_into_struct is passed by reference to keep the position of the pointer in the array through function calls.
@param arg_current_tag the current array to be filled is passed by reference because it is changed within the function.
@return Array.
*/
private function prv_xml_to_array(&$arg_tags, &$arg_current_tag)
{
while(list(, $arr_tag) = each($arg_tags))
{
if($arr_tag['level'] > 1)
{
if ($arr_tag['type']=="complete") // if type = complete
{
$arg_current_tag[$arr_tag['attributes']['KEY']] = $arr_tag['value'];
}
elseif ($arr_tag['type']=="open") // if type = open
{
$this->prv_xml_to_array($arg_tags, $arg_current_tag[$arr_tag['attributes']['KEY']]);
}
elseif ($arr_tag['type']=="close") // if type = close
{
return;
} // end if type
} // end if level > 1
} // end while arg_tags
} // end function prv_xml_to_array
//-------------------------------------------------------------------
/**
Sets padding in xml text.
Helps to make the xmlcode readable but can be disabled by emptying arg_str_pad when we do not need to read the xml code.
@param arg_int_pad_number the number of indentation pads in this tag.
@param arg_str_pad the single pad size.
@return String pad.
*/
private function pad($arg_int_pad_number=0, $arg_str_pad="")
{
if(($arg_int_pad_number===0) || ($arg_str_pad===""))return "";
$i = 0;
$str_pad = "";
while($i < $arg_int_pad_number){
$str_pad .= $arg_str_pad;
$i++;
}
return ($str_pad ? "\n" . $str_pad : "");
} // end function pad
//-------------------------------------------------------------------
/**
Private Array to XML.
changes php arrays into xml text recursively.
@param arg_arr_array the array to be changed into XML.
@param arg_int_pad_number the number of pads of the current tag.
@param arg_str_pad the indentation pad text.
@return String xml text.
@see array_to_xml().
*/
private function prv_array_to_xml($arg_arr_array, $arg_int_pad_number=0, $arg_str_pad="")
{
//print $arg_int_pad_number;
$str_xml = "";
while(list($k, $v) = each($arg_arr_array)){
$str_xml .= $this->pad($arg_int_pad_number, $arg_str_pad) . "<a key=\"" . htmlspecialchars($k) . "\">";
if(is_array($v)){
$str_xml .= $this->prv_array_to_xml($v, $arg_int_pad_number+1, $arg_str_pad);
}else{
$str_xml .= $this->pad($arg_int_pad_number+1, $arg_str_pad) . htmlspecialchars($v);
}
$str_xml .= $this->pad($arg_int_pad_number, $arg_str_pad) . "</a>";
}
return $str_xml;
} // end function prv_array_to_xml
//-------------------------------------------------------------------
/**
Array to XML.
changes php arrays into xml text recursively.
@param arg_arr_array the array to be changed into XML.
@param arg_str_operation_name the name of the main xml tag.
@param arg_str_pad the indentation pad text.
@return String xml text.
@see prv_array_to_xml
*/
public function array_to_xml($arg_arr_array, $arg_str_operation_name="response", $arg_str_pad="")
{
if(!is_array($arg_arr_array))return false;
$str_xml = "<$arg_str_operation_name>";
$str_xml .= $this->prv_array_to_xml($arg_arr_array, 1, $arg_str_pad);
$str_xml .= ($arg_str_pad==="" ? "" : "\n") . "</$arg_str_operation_name>";
return $str_xml;
} // end function array_to_xml
//-------------------------------------------------------------------
} // end of class XML
?>
|