XMLReader-ом не верно разобрал, а потом сохранил в модель

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

XMLReader-ом не верно разобрал, а потом сохранил в модель

Сообщение webplus »

Здравствуйте!
Есть xml который я разбираю XMLReader-ом и сохраняю данные в модель.
Но категории <category> у меня почему то каждая нижняя вакансия наследует категории верхней вакансии

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

<vacancy>
  <url>https://example.com</url>
  <creation-date>2017-10-24 10:55:07 GMT+2</creation-date>
  <update-date>2017-11-15 14:43:33 GMT+2</update-date>
  <salary>20000</salary>
  <currency>UAH</currency>
  <category>
    <industry>Домашний сервис</industry>
  </category>
  <category>
    <industry>Ремонт техники и предметов быта</industry>
  </category>
  <category>
    <industry>Сельское хозяйство, агробизнес</industry>
  </category>
  <job-name>Помощники с проживанием</job-name>
  <employment>полная</employment>
  <description>.....................................</description>
  <requirement>
    <education>среднее</education>
    <experience>не требуется</experience>
  </requirement>
  <addresses>
    <address>
      <location>Украина, Киев</location>
    </address>
  </addresses>
  <company>
    <name>Test</name>
    <logo>url</logo>
    <contact-name>ваваав</contact-name>
    <hr-agency>false</hr-agency>
  </company>
</vacancy>
<vacancy>
  <url>https://example.com</url>
  <creation-date>2017-10-24 10:58:28 GMT+2</creation-date>
  <update-date>2017-11-15 14:43:31 GMT+2</update-date>
  <salary>15000</salary>
  <currency>UAH</currency>
  <category>
    <industry>Домашний сервис</industry>
  </category>
  <category>
    <industry>Сельское хозяйство, агробизнес</industry>
  </category>
  <category>
    <industry>Строительство, архитектура</industry>
  </category>
  <job-name>Ссадовник- хозяйственник</job-name>
  <employment>полная</employment>
  <description>Садовник ...................</description>
  <requirement>
    <education>среднее</education>
    <experience>не требуется</experience>
  </requirement>
  <addresses>
    <address>
      <location>Украина, Киев</location>
    </address>
  </addresses>
  <company>
    <name>N</name>
    <logo>N</logo>
    <contact-name>N</contact-name>
    <hr-agency>false</hr-agency>
  </company>
</vacancy>
Вот код парсера:

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

        $reader = new XMLReader;
        $reader->open($jobsfile);
        
        while($reader->read()) {
            if($reader->nodeType == XMLReader::ELEMENT) {
                $data = array();

                if ($reader->localName == 'vacancy') {
                
        		$data['category'] = [];
        		$data['city'] = [];
       			while($reader->read()) {   
       			
       		if ($reader->localName == 'industry') {
                    $reader->read();
                    if ($reader->nodeType == XMLReader::TEXT) {
                        $data['category'][] = $reader->value;
                    }
                }


                if ($reader->localName == 'location') {
                    $reader->read();
                    if ($reader->nodeType == XMLReader::TEXT) {
                        $data['city'][] = $reader->value;
                    }
                }  
                
                //**** Other attributes
       			
       			} 
       			
       			}
       			
       			if (count($data)){
       			//Save in model
       			}          
                
                }
                }
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: XMLReader-ом не верно разобрал, а потом сохранил в модель

Сообщение Dominus »

Попробуйте https://github.com/halilim/xml-iterator

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

use XmlIterator\XmlIterator;

$it = new XmlIterator($file, 'vacancy');
$result = [];
foreach ($it as $k => $v) {
    $categories = [];
    foreach($v['category'] as $key => $value) {
        $categories[$key] = $value['industry'];
    }
    $result[$k]['category'] = $categories;
    $result[$k]['city'] = $v['addresses']['address']['location'];
}

//\yii\helpers\VarDumper::dump($result, 10, 1);
//die;
Результат:

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

[
    0 => [
        'category' => [
            0 => 'Домашний сервис'
            1 => 'Ремонт техники и предметов быта'
            2 => 'Сельское хозяйство, агробизнес'
        ]
        'city' => 'Украина, Киев'
    ]
    1 => [
        'category' => [
            0 => 'Домашний сервис'
            1 => 'Сельское хозяйство, агробизнес'
            2 => 'Строительство, архитектура'
        ]
        'city' => 'Украина, Киев'
    ]
]
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить