CODE
<?php
require './(inc)class/xml.class.php';
$xml=new xml();
header('Content-Type: text/plain; charset=Windows-1251');
echo "Разбор XML-файла в массив:\n";
$arr=$xml->xml2arr('*http://betaws.darkagesworld.com/info.asmx/GetUserInfo?nick=RadLine');
var_dump($arr); echo "\n\n";
?>
require './(inc)class/xml.class.php';
$xml=new xml();
header('Content-Type: text/plain; charset=Windows-1251');
echo "Разбор XML-файла в массив:\n";
$arr=$xml->xml2arr('*http://betaws.darkagesworld.com/info.asmx/GetUserInfo?nick=RadLine');
var_dump($arr); echo "\n\n";
?>
Состав xml.class.php
CODE
<?php
class xml{
var $CASE_FOLDING=0;
var $SKIP_WHITE=1;
//var $ACCEPT_CHARSET='k';
//var $USE_32bits_sums=1;
var $headline='<?xml version="1.0" encoding="Windows-1251" ?>';
var $xml=false;
var $values=false;
var $index=false;
var $tree=false;
/****************
(constructor) xml();
****************/
function xml(){
return $this;
}
/****************
(method) xml2arr($fileName=='*file.xml'&&$strXml=='<..></..>');
----
Создаёт многомерный массив (хеш), разбирая XML.
****************/
function xml2arr($xml=false){
if(!$xml) return false;
if(substr(trim($xml), 0, 1)=='*'&&is_readable(substr(trim($xml), 1))) $this->xml=str_replace("\r", '', implode('', file(substr(trim($xml), 1))));
elseif(substr(trim($xml), 0, 1)=='*'&&!is_readable(substr(trim($xml), 1))) die('(class)xml: Не могу прочитать файл.');
else $this->xml=$xml;
$pr=xml_parser_create();
xml_parser_set_option($pr, XML_OPTION_CASE_FOLDING, $this->CASE_FOLDING);
xml_parser_set_option($pr, XML_OPTION_SKIP_WHITE, $this->SKIP_WHITE);
xml_parse_into_struct($pr, $this->xml, $this->values, $this->index);
xml_parser_free($pr);
$i=-1;
$this->tree=$this->_get_depth($this->values, $i);
return $this->tree;
}
/****************
(system method) _get_depth($vals[array], &$i[int]);
****************/
function _get_depth($vals, &$i){
$child=array();
if(isset($vals[$i]['value'])) $child[]=$vals[$i]['value'];
while(++$i<count($vals)){
$type=$vals[$i]['type'];
if($type=='open'){
if(isset($vals[$i]['attributes'])) $attr=$vals[$i]['attributes']; else $attr=array();
$child[$vals[$i]['tag']][]=array(
'#'=>$this->_get_depth($vals, $i),
'@'=>$this->_decode_attributes($attr),
);
}elseif($type=='cdata'){
$child[]=$this->_unconv_cdata($vals[$i]['value']);
}elseif($type=='complete'){
if(isset($vals[$i]['attributes'])) $attr=$vals[$i]['attributes']; else $attr=array();
if(isset($vals[$i]['value'])) $value=$vals[$i]['value']; else $value=null;
$child[$vals[$i]['tag']][]=array(
'#'=>$value,
'@'=>$this->_decode_attributes($attr),
);
}elseif($type=='close'){
return $child;
}
}
return $child;
}
/****************
(method) arr2xml($arr[array], $headline[str]=false, $fileName[str]=false);
----
Создаёт валидный XML из, соответственно, валидного массива данных,
ala XML_in_ARRAY;)
****************/
function arr2xml($arr=false, $headline=false, $fileName=false){
if(!$arr) return false;
$xml=$headline?$headline:$this->headline; $xml.="\n";
$xml.=$this->_get_xml($arr, 0);
$this->xml=$xml;
if($fileName){
# // $xml.=$this->_32bits_summ($xml);
if(!($fh=fopen($fileName, 'w'))) die('(class)xml: Не могу записать файл!');
flock($fh, LOCK_EX);
$byte=fputs($fh, $xml);
fclose($fh);
}
return $fileName?$byte:$xml;
}
/****************
(system method) _get_xml($arr[array], $tabsi[int]);
****************/
function _get_xml($arr, $tabsi){
$source=null; $tabs=null;
$i=0; while(++$i<=$tabsi) $tabs.="\t";
foreach($arr as $k0=>$v0) foreach($v0 as $k1=>$v1){
if(is_array($v1['#'])){
$tabsi++;
$source.="$tabs<$k0".$this->_encode_attributes($v1['@']).">\n".$this->_get_xml($v1['#'], $tabsi)."$tabs</$k0>\n";
$tabsi--;
}elseif($v1['#']===null){
$source.="$tabs<$k0".$this->_encode_attributes($v1['@'])." />\n";
}else{
$source.="$tabs<$k0".$this->_encode_attributes($v1['@']).">".$this->_cdata($v1['#'])."</$k0>\n";
}
}
if($tabsi==0) $source=substr($source, 0, strlen($source)-1);
return $source;
}
/****************
(system other methods)
----
Различные простые вспомогательные финкции
(методы, если так угодно :) )
****************/
function _cdata($s){
if(preg_match("/['\"\[\]<>&]/", $s)) $s='<![CDATA['.$this->_conv_cdata($s).']]>';
$s=str_replace("\r", '', $s);
return $s;
} # //
function _conv_cdata($s){
$s=str_replace('<![CDATA[', '<!ў|CDATA|', $s);
$s=str_replace(']]>', '|ў]>', $s);
return $s;
}
function _unconv_cdata($s){
$s=str_replace('<!ў|CDATA|', '<![CDATA[', $s);
$s=str_replace('|ў]>', ']]>', $s);
return $s;
} # //
function _encode_attributes($arr){
$s='';
foreach($arr as $k=>$v) $s.=" $k=\"".$this->_encode_attribute($v)."\"";
return $s;
} # //
function _decode_attributes($arr){
foreach($arr as $k=>$v) $arr[$k]=$this->_decode_attribute($v);
return $arr;
} # //
function _encode_attribute($s){
$s=preg_replace("/&(?!#[0-9]+;)/s", '&', $s);
$s=str_replace("<", "<" , $s);
$s=str_replace(">", ">", $s);
$s=str_replace('"', """, $s);
$s=str_replace("'", ''', $s);
return $s;
}
function _decode_attribute($s){
$s=str_replace("&", "&", $s);
$s=str_replace("<" , "<", $s);
$s=str_replace(">" , ">", $s);
$s=str_replace(""", '"', $s);
$s=str_replace("'", "'", $s);
return $s;
}
/*
function _32bits_summ($str){
return '<!-- '.md5(strval(strlen($str)+51)).' -->';
}
*/
# конец класса `xml`
}
?>
В конце концов получается вот что:
Разбор XML-файла в массив:
(class)xml: Не могу прочитать файл.
(http://alliance.timebattle.ru/sample.php)
В php кое-что соображаю, но далеко не всё
Подскажите что сделать чтоб заработало