Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 20:32   #1
yaskin
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 112
По умолчанию Парсинг XML поправить код

Помогите поправить код. При разборе XML для яндекса не распарсиваются уровни picture и description
Вот функция которая разбирает XML в массив данных

Код:
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. Простите за сумбурное изложение.

Для спасибо весы слева
yaskin вне форума Ответить с цитированием
Старый 25.03.2012, 20:38   #2
yaskin
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 112
По умолчанию


Добавил фотку, чтоб видно было

а это код записи товаров из массива
Код:
<?
	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;
    }
Для спасибо весы слева
yaskin вне форума Ответить с цитированием
Старый 25.03.2012, 22:40   #3
StagnantIce
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 60
По умолчанию

А товары из массива нормально отрабатывают?
Я так понимаю проблема в переводе строки.. или я не прав?
Мои статьи по веб-программированию http://pihpi.ru
StagnantIce вне форума Ответить с цитированием
Старый 26.03.2012, 01:52   #4
yaskin
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 112
По умолчанию

Если массив парсится из варианта типа как на второй картинке, то все нормально отрабатывается, но если встречаются узлы, как на первой картинке типа picture и description, то скрипт их не обрабатывает, а надо чтоб обрабатывал.
Для спасибо весы слева
yaskin вне форума Ответить с цитированием
Старый 26.03.2012, 19:28   #5
yaskin
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 112
По умолчанию

Есть у кого какие идеи как это реализовать?
Для спасибо весы слева
yaskin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
xml парсинг Letnab Работа с сетью в Delphi 0 07.01.2012 12:56
Парсинг XML Aleskandr PHP 1 24.08.2011 14:32
Парсинг XML. Abuhamed PHP 1 01.06.2011 22:24
Парсинг XML [Smarik] Общие вопросы Delphi 6 13.03.2010 17:38
Поправить Код... Lucchese Общие вопросы C/C++ 1 25.01.2010 20:00