@sequelone

Как правильно спарсить XML указывая родителя субкатегориям?

Всем привет. Столкнулся с такой проблемой. Необходимо спарсить категории с субкатегориями жанры от литрес, хочется сделать это через простую функцию без велосипедов. По этой ссылке сгенированный XML с жанрами, который и нужно спарсить подставляя атрибут id как родительский к дочерним секциям.

Имется такая структура XML:

<genres>
        <genre id="5003" title="бизнес-книги" type="root">
                <genre id="5049" title="банковское дело" token="bankovskoe_delo" type="genre"/>
                <genre id="210646" title="бизнес-справочники" token="business-spravochniki" type="genre"/>
                <genre id="5051" title="бухучет / налогообложение / аудит" token="buhuchet_nalogooblozhenie_audit" type="genre"/>
                <genre id="6784" title="государственное и муниципальное управление" token="gosudarstvennoe_i_munitsipalnoe_upravlenie" type="genre"/>
                <genre id="5060" title="делопроизводство" token="deloproizvodstvo" type="genre"/>
                <genre id="5061" title="зарубежная деловая литература" token="zarubezhnaya_delovaya_literatura" type="genre"/>
                <genre id="5062" title="интернет-бизнес" token="internet" type="genre"/>
                 <genre id="5047" title="кадровый менеджмент" token="kadrovyj_menedzhment" type="container">
                          <genre id="5334" title="аттестация персонала" token="attestaciya_personala" type="genre"/>
                          <genre id="5330" title="гендерные различия" token="gendernyye_razlichiya" type="genre"/>
                          <genre id="5332" title="конфликты" token="konflikty" type="genre"/>
                          <genre id="5336" title="коучинг" token="kouching" type="genre"/>
                          <genre id="5333" title="мотивация" token="motivaciya" type="genre"/>
                          <genre id="5335" title="поиск и подбор персонала" token="poisk_presonala_hr" type="genre"/>
                          <genre id="5331" title="тимбилдинг" token="timbilding" type="genre"/>
                          <genre id="6583" title="управление персоналом" token="upravlenie_personalom" type="genre"/>
                 </genre>
...
</genres>


Написал такой код:

$url = 'https://partnersdnld.litres.ru/genres_list_2/';

        $dom = new DOMDocument('1.0', 'utf-8');

        $dom->load($url);
        $xpath = new DOMXpath($dom);

        foreach ($xpath->evaluate('//genre') as $node) {
            var_dump(
                [
                    'parent_id' => $xpath->evaluate('string(ancestor::genre[1]/id)', $node),
                    'id' => $xpath->evaluate('string(id)', $node),
                    'title' => $xpath->evaluate('string(title)', $node),
                ]
            );
        }


И сам запутался в секциях и атрибутах. Может кто-нибудь подсказать почему выводит пустые результаты и как правильно спарсить parent_id и остальные данные?
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
@sequelone Автор вопроса
Атрибуты находятся на другой оси Xpath. id является сокращением от child::id и будет извлекать узел элемента на дочерней оси. Для оси атрибутов нужно использовать attribute::id или ярлык @id.

foreach ($xpath->evaluate('//genre') as $node) {
    var_dump(
        [
            'parent_id' => $xpath->evaluate('string(ancestor::genre[1]/@id)', $node),
            'id' => $node->getAttribute('id'),
            'title' => $node->getAttribute('title'),
        ]
    );
}


Все заработало как надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы