|
автор: 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(); не разообрался, может с их помощью так можно раскладывать? Заодно что они именно делают, и как их использовать? | |
|
|
|
|
|
|
|
для: 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($prs, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($prs, XML_OPTION_CASE_FOLDING, 0);
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'] == 1 ) 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 в 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($prs, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($prs, XML_OPTION_CASE_FOLDING, 0);
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
)
по крайнй мере есть пища для размышления | |
|
|
|
|
|
|
|
для: ZiZ
(25.06.2006 в 21:08)
| | Тока как сделать, чтобы скрипт сам определял ключи и вписывал их в массив?
Разбором массивов $vals и $indx. Вообще, для каждой xml-структуры создаётся свой обработчик, иначе xml_parser не давал бы такой общей схемы.
Советую воспользоваться расширением PEAR - PEAR::XML_Parser. | |
|
|
|