Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: из XML в массив
 
 автор: ZiZ   (25.06.2006 в 18:21)
 
 

Допустим есть XML-файл:

<?xml version='1.0' encoding='ISO-8859-1'?>
<ROOT>
<ROW>
<userId>1</userId>
<userName>Guest</userName>
</ROW>
<ROW>
<userId>2</userId>
<userName>Guest2</userName>
</ROW>
</ROOT>

Надо разложить его ключи в один массив, а значения в другой; или в один. Лишь бы понятный структурированный массив.
Даже не представляю как сделать. С функциями xmp_parser_create(); xmp_parse(); не разообрался, может с их помощью так можно раскладывать? Заодно что они именно делают, и как их использовать?

   
 
 автор: Саня   (25.06.2006 в 19:56)   письмо автору
 
   для: ZiZ   (25.06.2006 в 18:21)
 

<?php
$xml 
"<?xml version='1.0' encoding='ISO-8859-1'?>
<ROOT>
<ROW>
<userId>1</userId>
<userName>Guest</userName>
</ROW>
<ROW>
<userId>2</userId>
<userName>Guest2</userName>
</ROW>
</ROOT>"
;
$prs xml_parser_create("ISO-8859-1");
xml_parser_set_option($prsXML_OPTION_SKIP_WHITE1);
xml_parser_set_option($prsXML_OPTION_CASE_FOLDING0);
xml_parse_into_struct($prs$xml$vals);
xml_parser_free($prs);

$res['ROOT'] = array(); // result
for ( $i 0$n 0$i count($vals); $i++ ) {
  
// пропуск тегов первого уровня
  
if ( $vals[$i]['level'] == ) continue;
  
// обработка блока <ROW>
  
if ( $vals[$i]['tag'] == "ROW" && $vals[$i]['type'] == "open" ) {
    
$res['ROOT'][$n] = array();
    
// пока не встретится закрывающий тег </ROW> будем добавлять значения
    
while ( $vals[++$i]['type'] !== "close" ) {
      
$res['ROOT'][$n][$vals[$i]['tag']] = $vals[$i]['value'];
    }
    
$n++;
  } else continue;
}

print 
"<pre>";
print_r($res);
?>

В итоге вышел такой массив:
Array
(
    [ROOT] => Array
        (
            [0] => Array
                (
                    [userId] => 1
                    [userName] => Guest
                )
            [1] => Array
                (
                    [userId] => 2
                    [userName] => Guest2
                )
        )
)

Если чего непонятно - спрашивай.

   
 
 автор: Саня   (25.06.2006 в 20:15)   письмо автору
 
   для: Саня   (25.06.2006 в 19:56)
 

А вот ещё вариант:
<?php
$xml 
"<?xml version='1.0' encoding='ISO-8859-1'?>
<ROOT>
<ROW>
<userId>1</userId>
<userName>Guest</userName>
</ROW>
<ROW>
<userId>2</userId>
<userName>Guest2</userName>
</ROW>
</ROOT>"
;
$prs xml_parser_create("ISO-8859-1");
xml_parser_set_option($prsXML_OPTION_SKIP_WHITE1);
xml_parser_set_option($prsXML_OPTION_CASE_FOLDING0);
xml_parse_into_struct($prs$xml$vals$indx);
xml_parser_free($prs);

$res = array();
for ( 
$i 0$i count($indx['userName']); $i++ ) {
  
$res[] = array("userId"   => $vals[$indx['userId'][$i]]['value'],
                 
"userName" => $vals[$indx['userName'][$i]]['value']);
}
print_r($res);
?>

Результат этого скрипта:
Array
(
    [0] => Array
        (
            [userId] => 1
            [userName] => Guest
        )
    [1] => Array
        (
            [userId] => 2
            [userName] => Guest2
        )
)

   
 
 автор: ZiZ   (25.06.2006 в 21:08)
 
   для: Саня   (25.06.2006 в 20:15)
 

Круто! Тока как сделать, чтобы скрипт сам определял ключи и вписывал их в массив.
массив root? в нем массив row а в нем:
[0] => Array
(
[userId] => 1
[userName] => Guest
)
[1] => Array
(
[userId] => 2
[userName] => Guest2
)
по крайнй мере есть пища для размышления

   
 
 автор: Саня   (25.06.2006 в 21:55)   письмо автору
 
   для: ZiZ   (25.06.2006 в 21:08)
 

Тока как сделать, чтобы скрипт сам определял ключи и вписывал их в массив?
Разбором массивов $vals и $indx. Вообще, для каждой xml-структуры создаётся свой обработчик, иначе xml_parser не давал бы такой общей схемы.

Советую воспользоваться расширением PEAR - PEAR::XML_Parser.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования