powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [php] Парсинг XML поправить код
8 сообщений из 8, страница 1 из 1
[php] Парсинг XML поправить код
    #37722185
yaskin2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите поправить код. При разборе XML для яндекса не распарсиваются уровни picture и description
Вот функция которая разбирает XML в массив данных
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
function XMLtoArray($XML) 
{
// Инициализация парсера
    $xml_parser = xml_parser_create();	
	
// Устанавливаем опции в XML-разборщике, Первый параметр функции определяет анализатор XML, второй — имя интересующего нас параметра, а третий — его новое значение.	

// автоматическое преобразование имен тегов к верхнему регистру; 
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);	
	
// устанавливают опцию что могут быть пробелы	
    xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE,  1);	
	
// Разбираем XML-данные в структуру массива	$$vals
// где $xml_parser - Ссылка на используемый XML анализатор.
// $XML - Строка XML данных
// $vals - Массив значений XML данных.
    xml_parse_into_struct($xml_parser, $XML, $vals);	
	
// Освобождаем XML-разборщик	
    xml_parser_free($xml_parser);										
	
// wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie 
//создают таблицы с одинаковыми тегами на том же уровне (перевод с польского)
// Распарсиваем теги в таблицу
    $_tmp='';
    foreach ($vals as $xml_elem)
    { 
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close')
        {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete')
        {
            if ($_tmp==$x_tag) 
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy 
	// идти по таблице (польский)
    foreach ($vals as $xml_elem)
    { 
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open') 
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1) 
            $multi_key[$x_tag][$x_level]++;
        while($start_level < $x_level)
        {
              $php_stmt .= '[$level['.$start_level.']]';
              if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level]) 
                  $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
              $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete'))
        {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
             $add='['.$multi_key2[$x_tag][$x_level].']'; 
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes',$xml_elem))
        {
            if ($x_type == 'open') 
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes',$xml_elem))
        {
            if (isset($xml_elem['value']))
            {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value)
            {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
// В конце концов все это извращение вернет нам XML в виде массива	
     return $xml_array;



Так вот в этом разборщике не читаются теги picture и description. Простите за сумбурное изложение.



а это код записи товаров из массива

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
	function parse_yml($buf) 
    {
        $result = XMLtoArray($buf);
		
		// Создаем категории
		$key = 0; 
		$arrcategory = array();
		$arrcategoryname = array();
		foreach ($result['yml_catalog']['shop']['categories']['category'] as $category) {
			$id = intval($category['id']);
			
			$cate_name = trim($category['content']);
			$parentid = isset($category['parentId']) ? $arrcategory[intval($category['parentId'])] : 0;
			$gcategory = $this->_gcategory_mod->get("cate_name = '$cate_name' AND parent_id = '$parentid'");
			if (!$gcategory)
			{
				//  Если категория не существует
				$id_ = $this->_gcategory_mod->add(array(
					'cate_name'     => $cate_name,
					'parent_id'     => $parentid,
					'sort_order'    => 255,
					'if_show'       => 1,
				));
				$arrcategory[$id] = $id_;
				$arrcategoryname[$id] = $cate_name;
			}
			else
			{
				// Уже существует
				$arrcategory[$id] = $gcategory['cate_id'];
				$arrcategoryname[$id] = $gcategory['cate_name'];
			}
		}
		
		// запись товаров
		$records = array();
        $key = 0;
		foreach ($result['yml_catalog']['shop']['offers']['offer'] as $offer) {
            $record = array();
            $record[FIELD_ADD_TIME]		= gmtime();
            $record[FIELD_LAST_UPDATE]	= $record[FIELD_ADD_TIME];
            $record[FIELD_DESCRIPTION]	= str_replace("'", '', $offer['description']);
            $record[FIELD_GOODS_IMAGE]	= $offer['picture'];
            $record[FIELD_IF_SHOW]		= 1;
            $record[FIELD_GOODS_NAME]	= str_replace("'", '', ($offer['name'] != '') ? $offer['name'] : $offer['model']);
            $record[FIELD_PRICE]		= $offer['price'];
            $record[FIELD_RECOMMENDED]	= 0;
            $record[FIELD_GOODS_ATTR]	= 0;
            $record[FIELD_SALE_ATTR]	= 0;
            $record[FIELD_BRAND]		= str_replace("'", '', $offer['vendor']);
			$record[FIELD_STOCK]		= 0;
			$cate_id = intval($offer['categoryId']);
            $record[FIELD_CAT_ID]		= $arrcategory[$cate_id];
			$record[FIELD_CAT_NAME]		= $arrcategoryname[$cate_id];

            $records[$key] = $record;
			$key++;
        }
        return $records;
    }
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37722337
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
 if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level]) 
                  $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';


никогда так не пиши
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37722419
yaskin2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Почему? Этот скрипт выдран на каком-то польском форуме, и нормально отрабатывает
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37722420
yaskin2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yaskin2ScareCrow,

Почему? Этот скрипт выдран на каком-то польском форуме, и нормально отрабатывает Только вложенные теги не обрабатывает, а надо чтоб обрабатывал
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37724022
yaskin2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у кого какие идеи как это реализовать?
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37724407
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yaskin2,

Взять и самому написать в два раза короче и понятней для себя.
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37724514
dresden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikkiMouse,

авторВзять и самому написать в два раза короче и понятней для себя.
+10
...
Рейтинг: 0 / 0
[php] Парсинг XML поправить код
    #37728944
yaskin2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikkiMouseyaskin2,

Взять и самому написать в два раза короче и понятней для себя.
Если б мог, уже б давно написал, и не задавал бы вопрос здесь. Код меня устраивает, мне нужно выяснить, как сделать чтоб парсер вложенные уровни читал.

ps Если нечего сказать по теме, пройди мимо. Флудить все умеют. здесь по-моему не нуллед, и посты не засчитываются.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [php] Парсинг XML поправить код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]