Здравствуйте, помогите с задачей, делаю парсинг дерева категорий:
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 у каждой категории, то проблем б не возникло, помогите пожалуйста с проблемой)
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 у каждой категории, то проблем б не возникло, помогите пожалуйста с проблемой)