|
|
|
| Производится разбор xml-файла, содержимое которого приведено ниже. Там есть раздел <Группы>, в котором содержатся 1 и более <Группа>. А в <Группа> могут быть вложены и другие подразделы: <Группы>.
Похоже, что без рекурсии не обойтись.
Одну строку я извлекаю так:
<?php
$xml = simplexml_load_file("import.xml");
if ($xml) {
foreach ($xml->Классификатор->Группы[0] as $item) {
echo (string) $item->Наименование[0], '[', (string) $item->Ид[0], '] ', "\n";
}
}
|
А как сделать рекурсию, чтобы извлечь пары ИД-Наимеование с информацией о том, какая группа в какую вложена?
<?xml version="1.0" encoding="utf-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.04" ДатаФормирования="2012-12-20T21:41:34"><Классификатор>
<Группы>
<Группа>
<Ид>F6FF40B4-556F-E943-DCAF-0BCE308FEBEF</Ид>
<Наименование>Первая группа</Наименование>
<Описание></Описание>
<Группы>
<Группа>
<Ид>CDC01E36-BE83-B77F-93C7-7D3C4BF709ED</Ид>
<Наименование>Овощи</Наименование>
<Описание></Описание>
</Группа>
</Группы>
<Группы>
<Группа>
<Ид>7645A435-77DD-B2C6-421B-63A178DDB760</Ид>
<Наименование>Фрукты</Наименование>
<Описание></Описание>
<Группы>
<Группа>
<Ид>A183F863-22F9-4410-B4AF-5BCF1EB8CBB9</Ид>
<Наименование>Африканские</Наименование>
<Описание></Описание>
<Группы>
<Группа>
<Ид>427D57BD-862C-0A88-EDC2-FED3B9CE77D2</Ид>
<Наименование>Национальные</Наименование>
<Описание></Описание>
</Группа>
</Группы>
</Группа>
</Группы>
</Группа>
</Группы>
</Группа>
</Группы>
<Группы>
<Группа>
<Ид>A9678AEC-859C-0FE4-51A3-DFE0B7F251C3</Ид>
<Наименование>Вторая группа</Наименование>
<Описание></Описание>
</Группа>
</Группы>
</Классификатор>
<Каталог>
<Товары>
</Товары>
</Каталог>
</КоммерческаяИнформация>
|
| |
|
|
|
|
|
|
|
для: Владимир55
(23.12.2012 в 12:23)
| | Выведите после $xml = simplexml_load_file("import.xml");
echo'<pre>';print_r($xml);echo'</pre>';
| , чтоб понятней было с чем дело имеем.... | |
|
|
|
|
 8.7 Кб |
|
|
для: Sfinks
(23.12.2012 в 15:21)
| | Я тоже начал с этого листинга и таким образом разобрался с товаром. Сейчас, чтобы не загромождать и без того большой текст, товар удален, ибо в каталоге его может и не быть, но структкра должна сохраняться.
В качестве дубля этот же листинг во вложении.
SimpleXMLElement Object
(
[@attributes] => Array
(
[ВерсияСхемы] => 2.04
[ДатаФормирования] => 2012-12-20T21:41:34
)
[Классификатор] => SimpleXMLElement Object
(
[Группы] => Array
(
[0] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => F6FF40B4-556F-E943-DCAF-0BCE308FEBEF
[Наименование] => Первая группа
[Описание] => SimpleXMLElement Object
(
)
[Группы] => Array
(
[0] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => CDC01E36-BE83-B77F-93C7-7D3C4BF709ED
[Наименование] => Овощи
[Описание] => SimpleXMLElement Object
(
)
)
)
[1] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => 7645A435-77DD-B2C6-421B-63A178DDB760
[Наименование] => Фрукты
[Описание] => SimpleXMLElement Object
(
)
[Группы] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => A183F863-22F9-4410-B4AF-5BCF1EB8CBB9
[Наименование] => Африканские
[Описание] => SimpleXMLElement Object
(
)
[Группы] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => 427D57BD-862C-0A88-EDC2-FED3B9CE77D2
[Наименование] => Национальные
[Описание] => SimpleXMLElement Object
(
)
)
)
)
)
)
)
)
)
)
[1] => SimpleXMLElement Object
(
[Группа] => SimpleXMLElement Object
(
[Ид] => A9678AEC-859C-0FE4-51A3-DFE0B7F251C3
[Наименование] => Вторая группа
[Описание] => SimpleXMLElement Object
(
)
)
)
)
)
[Каталог] => SimpleXMLElement Object
(
[Товары] => SimpleXMLElement Object
(
[Товар] => Array
(
[0] => SimpleXMLElement Object
(
[Ид] => 8D9E1B8C-4C64-B314-2159-65A8828743C9
[Артикул] => 855466524
[Наименование] => Комплект МСК
[Описание] => SimpleXMLElement Object
(
)
[БазоваяЕдиница] => SimpleXMLElement Object
(
[@attributes] => Array
(
[НаименованиеПолное] =>
)
)
[Группы] => SimpleXMLElement Object
(
[Ид] => F6FF40B4-556F-E943-DCAF-0BCE308FEBEF
)
)
[1] => SimpleXMLElement Object
(
[Ид] => B4139568-8973-5BD8-3F3A-4D68ACACFF33
[Артикул] => 855466524
[Наименование] => S-Class 3,0L
[Описание] => SimpleXMLElement Object
(
)
[БазоваяЕдиница] => SimpleXMLElement Object
(
[@attributes] => Array
(
[НаименованиеПолное] =>
)
)
[Группы] => SimpleXMLElement Object
(
[Ид] => 427D57BD-862C-0A88-EDC2-FED3B9CE77D2
)
)
)
)
)
)
|
| |
|
|
|
|
|
|
|
для: Владимир55
(23.12.2012 в 16:12)
| |
<?php
function recurs( $arr, $base='', $level=0 )
{
foreach( $arr as $val )
if( key_exists( 'Группа', $val)
&& key_exists( 'Наименование', $val['Группа'] )
){
echo '<br>'.str_repeat(' ',$level).$base.'/'.$val['Группа']['Наименование'];
if( key_exists( 'Ид', $val['Группа'] ) ) echo '<br>'.str_repeat(' ',$level).' Ид: '.$val['Группа']['Ид'];
if( key_exists( 'Группы', $val['Группа'] ) ) recurs( $val['Группа']['Группы'], $base.'/'.$val['Группа']['Наименование'], $level+1 );
}
}
recurs( $xml['Классификатор']['Группы'] );
?>
| кажись так. | |
|
|
|
|
 817 байт |
|
|
для: Sfinks
(31.12.2012 в 14:09)
| | К сожалению, этот код не работает... Вообще ничего не выводит. Можете попробовать сами - файл каталога во вложении.
Сложная какая-то рекурсия получается. Пробовал и так - тоже не пашет:
<?php
function my_func (SimpleXMLElement $el)
{
if (count($el->children() )) {
foreach($el->children() as $ch) {
if ($ch->getName() == 'Группа') {
echo (string) $el->Наименование[0], '[', (string) $el->Ид[0], '] ', "\n";
}
my_func($ch);
}
}
}
if (($xml = simplexml_load_file("import.xml")))
{
my_func($xml);
}
|
| |
|
|
|
|
|
|
|
для: Владимир55
(03.01.2013 в 18:40)
| | Проблема разрешилась.
Спасибо! | |
|
|
|
|
|
|
|
для: Владимир55
(03.01.2013 в 22:13)
| | А я только хотел написать что чуть попозже поковыряюсь =) | |
|
|
|
|
 33.8 Кб |
|
|
для: Sfinks
(03.01.2013 в 22:20)
| | Все же меня несколько смущает, что в составленной функции закрывающиеся скобки как-бы выходят за ее пределы.
В принципе, количество открывающихся и закрывающихся скобок совпадает, но написание какое-то нетрадиционное.
Как на Ваш взгляд?
(выходными параметрами являются массивы $m_adres_grupp, $m_guid_grupp).
<?php
function func_grupp (SimpleXMLElement $el, $r)
{
global $m_adres_grupp, $m_guid_grupp;
if (count($el->children() ))
{
foreach($el->children() as $ch)
{
$tmp_arr = $r;
if (strpos($ch->getName(), 'Группа') === 0)
{
$tmp_arr[] = $ch->
{'Наименование'};
// echo implode('/', $tmp_arr), ' [', $ch->{'Ид'}, "]\n <br />";
$m_adres_grupp[] = implode('/', $tmp_arr);
$m_guid_grupp[] = $ch->{'Ид'};
}
func_grupp($ch, $tmp_arr);
}
}
}
func_grupp(simplexml_load_file('commerce/import.xml'), array());
|
В редакторе (вложение) особенно хорошо видно, что вышла за пределы функции последняя скобка. | |
|
|
|
|
|
|
|
для: Владимир55
(04.01.2013 в 19:14)
| | Вы о форматировании кода чтоль?
А что мешает подвинуть скобки?
function func_grupp (SimpleXMLElement $el, $r)
{
global $m_adres_grupp, $m_guid_grupp;
if (count($el->children() ))
{
foreach($el->children() as $ch)
{
$tmp_arr = $r;
if (strpos($ch->getName(), 'Группа') === 0)
{
$tmp_arr[] = $ch->{'Наименование'};
// echo implode('/', $tmp_arr), ' [', $ch->{'Ид'}, "]\n <br />";
$m_adres_grupp[] = implode('/', $tmp_arr);
$m_guid_grupp[] = $ch->{'Ид'};
}
func_grupp($ch, $tmp_arr);
}
}
}
| так лучше? =) | |
|
|
|
|
 103.4 Кб |
|
|
для: Sfinks
(06.01.2013 в 02:26)
| | Перемещение скобок по экрану, разумеется, само по себе ничего не меняет - коды по-прежнему выходят за пределы функции (на скриншоте помечены красным). | |
|
|
|
|
|
|
|
для: Владимир55
(06.01.2013 в 11:01)
| | Редактор судя по всему не очень интеллектуально обрабатывает фигурные скобки. | |
|
|
|