Нужна помощь в парсинге xml через php в yii

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

Всем доброго дня, понимаю, что не много не в тему, но учитывая, что проект пишу на yii, решил обратиться к вам. Подскажите пожалуйста, что я делаю не так. Наверняка уже кто-то эту задачу делал и может поделиться опытом. В чем суть, ранее мне доводилось парсить xml-ки, но они были чисто на текст. Сейчас задача в чем, распарсил xml-ку, в ней в рамках первого цикла могу обращаться к любым объектам и их(свойствам). У каждой записи плюсом есть галерея фотографий. Это еще массив. Т.е. первую вложенность - (1ый массив) я обрабатываю первым циклом, а вложенный в него массив с картинками я обрабатываю вторым циклом., т.е. получается цикл в цикле.

Какая проблема сейчас, я не понимаю как мне сохранить пути к картинкам в бд. Кол-во картинок у каждой записи может быть разное, у какой-то 2, а какой-то 8. Не знаю правильный ли подход выбрал. Сделал в таблице одно поле img (varchar на 400 символов), и мысль такая, чтобы записать туда примерно следующее 1.jpg|2.jpg|3.jpg и т.д., а потом explode-ом разбивать и работать с элементами. Но сейчас не могу сообразить, как именно записать эти картинки в бд. Основные поля записываются без проблем, а для картинок ведь второй цикл предусмотрен, то ли мне нужно еще экземпляр объекта создавать с последующим сохранением элемента в поле толи нет... Путаюсь в общем... Помогите раскурить, не знаю как сделать грамотно, не хочу всякие говнокоды и костыли(.

Код прилагаю:

Код: Выделить всё

		
		
		
		xml такого вида
		
		
		
		<?xml version="1.0" encoding="UTF-8"?>

-<Ads target="Avito.ru" formatVersion="3">


-<Ad>

<id>203028</id>

<ContactPhone>+7 342 205 56 00</ContactPhone>

<Region>Пермский край</Region>

<City>Пермь</City>

<District>Ленинский</District>

<Street>Спешилова, 104а</Street>

<Description>Музыка, сигнализация с автозапуском, подушка безопасности водителя и пассажира.<br/>Специальные условия на автомобили с пробегом:<br/> • Простое оформление кредита<br/> • Ставка по кредиту от 12,9%<br/> • Вы сами решаете, нужно ли вам КАСКО или нет. Мы - только рекомендуем.</Description>

<Category>Автомобили</Category>

<CarType>С пробегом</CarType>

<Price>480000</Price>

<Make>Renault</Make>

<Model>Sandero Stepway</Model>

<Year>2014</Year>

<Kilometrage>80600</Kilometrage>

<Accident>Не битый</Accident>

<VIN>X7LBSRBYNEH728751</VIN>

<CertificationNumber>5925№119599</CertificationNumber>

<BodyType>хетчбэк</BodyType>

<Doors>4</Doors>

<Color>Красный</Color>

<FuelType>Бензин</FuelType>

<EngineSize>1.6</EngineSize>

<Power>103</Power>

<Transmission>Автомат</Transmission>

<DriveType>Передний</DriveType>

<WheelType>Левый</WheelType>

<Owners>1</Owners>

<PowerSteering>Гидро-</PowerSteering>

<ClimateControl>Кондиционер</ClimateControl>

<Interior>Ткань</Interior>

<PowerWindows>Только передние</PowerWindows>

<Wheels>16</Wheels>


-<Images>

<Image name="203028_1.JPG"/>

<Image name="203028_2.JPG"/>

<Image name="203028_3.JPG"/>

<Image name="203028_4.JPG"/>

<Image name="203028_5.JPG"/>

<Image name="203028_6.JPG"/>

</Images>

</Ad>

</Ads>
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		//читаем xml
		$xmlData = simplexml_load_file('uploadAuto/Avto.xml');

		//в цикле создаем объекты с параметрами, и пишем в базу
		foreach($xmlData as $key => $item){
			
			$addAuto = new Auto;
						
			/** базовые данные */
			$addAuto->id 					= $item->id;
			$addAuto->ContactPhone 			= $item->ContactPhone;
			$addAuto->Region 				= $item->Region;
			$addAuto->City 				= $item->City;
			$addAuto->District 				= $item->District;
			$addAuto->Street 				= $item->Street;
			$addAuto->Description 			= $item->Description;
			$addAuto->Category 				= $item->Category;
			$addAuto->CarType 				= $item->CarType;
			$addAuto->Price 				= $item->Price;
			$addAuto->Make 				= $item->Make;
			$addAuto->Model 				= $item->Model;
			$addAuto->Year 				= $item->Year;
			$addAuto->Kilometrage 			= $item->Kilometrage;
			$addAuto->Accident 				= $item->Accident;
			$addAuto->VIN 					= $item->VIN;
			$addAuto->CertificationNumber 	= $item->CertificationNumber;
			$addAuto->BodyType 			= $item->BodyType;
			$addAuto->Doors 				= $item->Doors;
			$addAuto->Color 				= $item->Color;
			$addAuto->FuelType 			= $item->FuelType;
			$addAuto->EngineSize 			= $item->EngineSize;
			$addAuto->Power 				= $item->Power;
			$addAuto->Transmission 			= $item->Transmission;
			$addAuto->DriveType 			= $item->DriveType;
			$addAuto->WheelType 			= $item->WheelType;
			$addAuto->Owners 				= $item->Owners;
			$addAuto->PowerSteering 			= $item->PowerSteering;
			$addAuto->ClimateControl 		= $item->ClimateControl;
			$addAuto->Interior 				= $item->Interior;
			$addAuto->PowerWindows 		= $item->PowerWindows;
			$addAuto->Wheels 				= $item->Wheels;
			//$addAuto->img				= 'img1.jpg|img2.jpg';
			
			/** базовые данные */
			
			/** парсинг массива картинок */
			foreach($item->Images->Image as $img){	
			
				$addAuto = new Auto;
				
				$addAuto->img 				=	$img['name']; //= 'img1.jpg|';
				
			}
			/** парсинг массива картинок */
			
			$addAuto->save(false);


			
		}
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Код: Выделить всё

$array = [];
foreach($item->Images->Image as $img){				
    $array[] = $img['name'];	 // собираем картинки в массив
}
$addAuto->img = serialize($array); // сериализуем
Ну и получение:

Код: Выделить всё

$model = $this->findModel($id);
$images = unserialize($model->img); // Получен массив картинок для модели.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

спасибо, но так я уже делал, сейчас выдает Serialization of 'SimpleXMLElement' is not allowed
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Данные в foreach приходят скорее всего не разбитые, сперва надо разбить.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

имеете ввиду во втором foreach-е где картинки?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

да
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

при таком раскладе выдает ошибку Serialization of 'SimpleXMLElement' is not allowed. А какую еще разбивку сделать?

Array
(
[0] => SimpleXMLElement Object
(
[0] => 203028_1.JPG
)

[1] => SimpleXMLElement Object
(
[0] => 203028_2.JPG
)

[2] => SimpleXMLElement Object
(
[0] => 203028_3.JPG
)

[3] => SimpleXMLElement Object
(
[0] => 203028_4.JPG
)

[4] => SimpleXMLElement Object
(
[0] => 203028_5.JPG
)

[5] => SimpleXMLElement Object
(
[0] => 203028_6.JPG
)

)
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Посмотрите что покажет

Код: Выделить всё

$array = [];
foreach($item->Images->Image as $img){				
    $array[] = $img['name'];	 // собираем картинки в массив
}
//$addAuto->img = serialize($array); // сериализуем
\yii\helpers\VarDumper::dump($array, 10, 1);
die;
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Ну вот, вам надо достать из объекта картинку, поэтому и не сериализует)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

получилось вот так.


array(6) {
[0]=>
object(SimpleXMLElement)#95 (1) {
[0]=>
string(12) "203028_1.JPG"
}
[1]=>
object(SimpleXMLElement)#93 (1) {
[0]=>
string(12) "203028_2.JPG"
}
[2]=>
object(SimpleXMLElement)#96 (1) {
[0]=>
string(12) "203028_3.JPG"
}
[3]=>
object(SimpleXMLElement)#97 (1) {
[0]=>
string(12) "203028_4.JPG"
}
[4]=>
object(SimpleXMLElement)#98 (1) {
[0]=>
string(12) "203028_5.JPG"
}
[5]=>
object(SimpleXMLElement)#99 (1) {
[0]=>
string(12) "203028_6.JPG"
}
}
int(10)
int(1)


А картинку то сейчас достать это 3-ий цикл что-ли нужен?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

получается так
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Как то так

Код: Выделить всё

$array = [];
foreach($item->Images->Image as $img){				
    foreach($img as $key => $value) {
        $array[] = $value;	 // собираем картинки в массив
    }
}
//$addAuto->img = serialize($array); // сериализуем
\yii\helpers\VarDumper::dump($array, 10, 1);
die;
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

не понимаю. Вот так:

на выходу массив получается вообще пустой.

/** парсинг массива картинок */
$images = [];
foreach($item->Images->Image as $img){
foreach($img as $key => $value) {
$images[] = $value; // собираем картинки в массив
}
}
//$addAuto->img = serialize($array); // сериализуем

print '<pre>';
print_r($images);
print '</pre>';
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Ну в общем вот что получилось:

Код: Выделить всё

$array = [];
foreach ($item->Images->Image as $img) {
    $array[] = self::xml2array($img)['@attributes']['name'];  // собираем картинки в массив
}
//$addAuto->img = serialize($array); // сериализуем
\yii\helpers\VarDumper::dump($array, 10, 1);
die;
/*
[
    0 => '203028_1.JPG'
    1 => '203028_2.JPG'
    2 => '203028_3.JPG'
    3 => '203028_4.JPG'
    4 => '203028_5.JPG'
    5 => '203028_6.JPG'
]
*/

//...
/**
 * Converting a SimpleXML Object to an Array
 */
function xml2array($xmlObject, $out = [])
{
    foreach ((array)$xmlObject as $index => $node)
        $out[$index] = (is_object($node)) ? self::xml2array($node) : $node;
    return $out;
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

а что за xml2array ?

В классе AutoController и его поведениях не найден метод или замыкание с именем "xml2array".
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

espltdmh50 писал(а): 2017.11.14, 14:00 а что за xml2array ?

В классе AutoController и его поведениях не найден метод или замыкание с именем "xml2array".

Код: Выделить всё

/**
 * Converting a SimpleXML Object to an Array
 */
function xml2array($xmlObject, $out = [])
{
    foreach ((array)$xmlObject as $index => $node)
        $out[$index] = (is_object($node)) ? self::xml2array($node) : $node;
    return $out;
}
Последний раз редактировалось Dominus 2017.11.14, 14:05, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

ой, пардон, вторая функция не скопировалась че-то. Сейчас попробую)
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

Что-то видимо я делаю не так. Сейчас пока во вьюхе пытаюсь проверить как отображаются данные, но ошибку все равно дает...

Код: Выделить всё

<?php


$xmlData = simplexml_load_file('uploadAuto/Avito.xml');
		
		//$addAuto = new Auto;

		foreach($xmlData as $key => $item){
						
			/** базовые данные */
			echo $item->id.'<br/>';
			echo $item->ContactPhone.'<br/>';
			echo $item->Region.'<br/>';
			echo $item->City.'<br/>';
			echo $item->District.'<br/>';
			echo $item->Street.'<br/>';
			//echo $item->Description.'<br/>';
			echo $item->Category.'<br/>';
			echo $item->CarType.'<br/>';
			echo $item->Price.'<br/>';
			echo $item->Make.'<br/>';
			echo $item->Model.'<br/>';
			echo $item->Year.'<br/>';
			echo $item->Kilometrage.'<br/>';
			echo $item->Accident.'<br/>';
			echo $item->VIN.'<br/>';
			echo $item->CertificationNumber.'<br/>';
			echo $item->BodyType.'<br/>';
			echo $item->Doors.'<br/>';
			echo $item->Color.'<br/>';
			echo $item->FuelType.'<br/>';
			echo $item->EngineSize.'<br/>';
			echo $item->Power.'<br/>';
			echo $item->Transmission.'<br/>';
			echo $item->DriveType.'<br/>';
			echo $item->WheelType.'<br/>';
			echo $item->Owners.'<br/>';
			echo $item->PowerSteering.'<br/>';
			echo $item->ClimateControl.'<br/>';
			echo $item->Interior.'<br/>';
			echo $item->PowerWindows.'<br/>';
			echo $item->Wheels.'<br/>';
			
			/** базовые данные */
		
			
			
			
			
			
			
			
			$array = [];
				foreach ($item->Images->Image as $img) {
					$array[] = self::xml2array($img)['@attributes']['name'];
			}
			
			
			
			print '<pre>';
			print_r($array);
			print '</pre>';
			
			
			
			
			echo '<hr/>';
			
			
			
			
			
			
				
				
				
			}
			
			
			
			
			
			
			
			
function xml2array($xmlObject, $out = [])
{
    foreach ((array)$xmlObject as $index => $node)
        $out[$index] = (is_object($node)) ? self::xml2array($node) : $node;
    return $out;
}
						
			
			
		
			
		
		
		
		
		
		


?>

Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в парсинге xml через php в yii

Сообщение Dominus »

Полный тестовый код:

Код: Выделить всё

class DefaultController extends Controller
{
    /**
     * Renders the index view for the module
     * @return string
     */
    public function actionIndex()
    {
        $xmlData = simplexml_load_file('Avto.xml');

        foreach ($xmlData as $key => $item) {

           /** базовые данные */
            echo $item->id.'<br/>';
            //...
            echo $item->Wheels.'<br/>';
            
            /** парсинг массива картинок */
            $array = [];
            foreach ($item->Images->Image as $img) {
                $array[] = self::xml2array($img)['@attributes']['name'];
            }
            //$addAuto->img = serialize($array); // сериализуем
            \yii\helpers\VarDumper::dump($array, 10, 1);
            die;

        }
        return $this->render('index');
    }

    function xml2array($xmlObject, $out = [])
    {
        foreach ((array)$xmlObject as $index => $node)
            $out[$index] = (is_object($node)) ? self::xml2array($node) : $node;

        return $out;
    }
}
Всё выводит норм.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в парсинге xml через php в yii

Сообщение espltdmh50 »

Спасибо, что помогли данные выцепить

0 => '1.jpg',
1 => '2.jpg' и т.д.

капец я с этим замучался, а можете принцип функции объяснить, почему у нас предыдущие способы, вроде на первый взгляд адекватные но не давали нужного результата а это заработало. Был очень благодарен, чтобы мне учесть на будущее)
Ответить