Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [php] Парсинг XML поправить код / 8 сообщений из 8, страница 1 из 1
25.03.2012, 21:05:08
    #37722185
yaskin2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[php] Парсинг XML поправить код
Помогите поправить код. При разборе 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
25.03.2012, 23:17:35
    #37722337
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[php] Парсинг XML поправить код
Код: 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
26.03.2012, 01:49:04
    #37722419
yaskin2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[php] Парсинг XML поправить код
ScareCrow,

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

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

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

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

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

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


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