day & night

запись XML в файл, обрабатывая многомерный массив, PHP
Дата обновления: , перейти к новому сообщению
#1
RadLine



Бывалый
*

Группа: Пользователи
Сообщений: 27
Регистрация: 1.10.2006
Пользователь №: 239.023


Респектов: 2
-----X----


Предупреждений:


Пытась выдрать из xml документа данные,кот. постоянно меняются, в многомерный массив для дальнейшего использывания.
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";
?>



Состав 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 кое-что соображаю, но далеко не всё sad.gif
Подскажите что сделать чтоб заработало
User is offline
Go topGo end
 

Ответов(1 - 3)
icon10 2.11.2006 - 12:45
#2
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




Хм... а зачем тебе многомерный массив?
С XML-ем куда удобнее работать.

Ты бы написал, что тебе дальше нужно с этими данными делать, может и массив-то не нужен.

И ещё вопрос - зачем устанавливаешь кодировку Win-1251, когда в XML-файле Utf-8?

Добавлено:

А вообще сходи на _http://ru.php.net/man...ml-xmltree.php и посмотри комменты юзеров... там есть уже кем-то написанная функция domxml_xmlarray.
User is offline
Go topGo end
12.11.2006 - 16:58
#3
RadLine



Бывалый
*

Группа: Пользователи
Сообщений: 27
Регистрация: 1.10.2006
Пользователь №: 239.023


Респектов: 2
-----X----


Предупреждений:


Есть такая страничка
http://ws.darkageswor...o?nick=RadLine

Возможно ли чтобы php обработала её так, чтобы в итоге мне были выданы переменные типа, - на примере:

Ok - станет переменной $p1
2006-11-08T21:24:44.6466524+03:00 - станет переменной $p2
- - все данные внутри - переменная $p3
RadLine - станет переменной $p4
Альянс - станет переменной $p5

и т.д.... по такому принципу ...

*...
User is offline
Go topGo end
icon10 14.11.2006 - 21:17
#4
дымчик



Специалист
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 475
Регистрация: 8.11.2005
Из: Санкт-Петербург
Пользователь №: 64.615


Респектов: 154
-----X----




QUOTE(RadLine @ 12.11.2006 - 17:58)
Есть такая страничка
http://ws.darkageswor...o?nick=RadLine

Возможно ли чтобы php обработала её так, чтобы в итоге мне были выданы переменные типа, - на примере:

Ok - станет переменной $p1
2006-11-08T21:24:44.6466524+03:00 - станет переменной $p2
- - все данные внутри - переменная $p3
RadLine - станет переменной $p4
Альянс - станет переменной $p5

и т.д.... по такому принципу ...

*...
*



Конечно можно... причем классы для работы с XMLем предлагают несколько вариантов решения проблемы. Например:
CODE

$xml = функция_для_получения_кода_страницы_из_урл(http://ws.darkagesworld.com/info.asmx/GetUserInfo?nick=RadLine);

if ($doc = @domxml_open_mem($xml)) {

  $root = $doc->document_element();
  $statusNodes = $doc->get_elements_by_tagname('status');
  $statusNode = $statusNodes[0];

  $status = $statusNode->get_content();  // Вот и твое значение статуса
  // Остальное по аналогии... а то сейчас времени нету. Так же вместо
  // интерфейса IDOMNODE можешь использовать XPATH'овский  
  // интерфейс - посмотри на php.net - там есть его описание

}
User is offline
Go topGo end

Topic Options
Сейчас: 1.05.2024 - 23:31
Мобильная версия | Lite версия