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

Статус
Закрыто для дальнейших ответов.

hausedark

Новичок
Регистрация
13.07.2016
Сообщения
1
Здравствуйте, помогите с задачей, делаю парсинг дерева категорий:

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 у каждой категории, то проблем б не возникло, помогите пожалуйста с проблемой)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ