Перейти к содержимому

Фотография
- - - - -

Perl парсинг xml дерева категорий и внесение в БД


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
В этой теме нет ответов

#1 hausedark

hausedark

    Прохожий

    Топикстартер
  • Новичок
  • 0
    1 сообщ.

Отправлено 13 Июль 2016 в 17:38

Здравствуйте, помогите с задачей, делаю парсинг дерева категорий: 

sub parse_categories {
    my $c = shift;
    
    $c = encode("utf8", decode("utf8", $c));
            
    my %ca = ();
    my $command = "select id from categories;";
    my $q = $dbh->prepare($command);
    $q->execute();
    while (my $r = $q->fetchrow_arrayref) {
        $ca{$$r[0]} = "on";
    }
    
    my @ar = split(/<category id="/, $c);
    for (my $i=1; $i<@ar; $i++) {
        my ($id, $name) = split(/" parent_id="/, $ar[$i]);
        my ($pid, $name) = split(/"><!\[CDATA\[/, $name,);
        ($name, $chop) = split(/\]\]><\/category>/, $name);
        next if ($id == 3811);
        if (($ca{$id} ne "") and ($ARGV[2] eq "update")) {
            print "upd $id;$pid;$name;\n";
            &exec_command("update categories set name = \'$name\', pid = \'$pid\' where id = \'$id\';");
        }
        next if ($ca{$id} ne "");
        print "$id;$pid;$name;\n";
        &exec_command("insert into categories (id, name, pid, kolvo) values (\'$id\', \'$name\', \'$pid\', 0);");
    }
    &update_categories;
}

Дерево категорий выглядит таким образом и все работает:

<category id="3680259" parent_Id="0">Футбол,баскетбол</category>
<category id="3680260" parent_Id="3680259">Футбол</category>
<category id="3680265" parent_Id="0">Рыбалка</category>
<category id="3680270" parent_Id="0">Велоспорт</category>
<category id="3680299" parent_Id="3680260">Сборная</category>

А что если родительский ID нулевой, будет отсутствовать, т.е.

<category id="3680259">Футбол,баскетбол</category>
<category id="3680260" parentId="3680259">Футбол</category>
<category id="3680265">Рыбалка</category>
<category id="3680270">Велоспорт</category>
<category id="3680299" parentId="3680260">Сборная</category>

В таком случае данный метод не работает, подскажите как исправить код чтобы при отсутствии parentId="0" в файле в БД писался только ID и NAME?

 

Вот print отработанного скрипта:

248;236;Оптические приборы;
250;236;Dvd и blu-ray плееры;
236"><![CDATA[Электроника и фото]]></category>
;;;
252;236;Портативная аудиотехника;
745;236;Видеокамеры;

В базу строка в которой отсутствует parent_Id записывается только ID. NAME остается пустым, при повторном запуске в заполненную БД получаем:

start parser - 13.7.2016 0:53
236"><![CDATA[Электроника и фото]]></category>
;;;
error = insert into categories (id, name, pid, kolvo) values ('236"><![CDATA[Электроника и фото]]></category>
', '', '', 0);

Но как уже говорил если бы был указан в XML parent_id у каждой категории, то проблем б не возникло, помогите пожалуйста с проблемой)


  • 0

Спонсор



Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение
Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей