Sie haben bereits eine Erklärung und eine Lösung, aber ich schlage die folgenden Änderungen vor
-
Sie sollten sich
prepare
dasINSERT INTO
SQL-Anweisung und dannexecute
es innerhalb der Schleife.do
hat einen viel größeren Overhead -
Der
//
(descendant-or-self::node()
) Das XPath-Konstrukt ist teuer und Sie sollten es für Fälle reservieren, in denen Sie keine Ahnung haben, wo sich das Element innerhalb des Dokuments befinden wird, was sehr selten vorkommt. In diesem Fall dierow1
Elemente befinden sich unter/database/row1s/row1
und dierow2
Elemente befinden sich unterrow2s/row2
relativ dazu -
Es ist viel sauberer, verschiedene Trennzeichen zu verwenden, wenn Sie Anführungszeichen innerhalb einer Zeichenfolge in Anführungszeichen verwenden möchten. Zum Beispiel
"My name is \"$name\""
ist viel besser alsqq{My name is "$name"}
Hier ist eine Version Ihres Programms, die Ihnen helfen könnte.
use strict;
use warnings;
use XML::XPath;
use DBI;
my $xp = XML::XPath->new( filename => 'animals4.xml' );
my $dbh = DBI->connect(
'DBI:mysql:test', 'user', 'pw',
{ RaiseError => 1, PrintError => 0}
) or die "Fehler beim Verbidungsaufbau zum MariaDB-Server: $DBI::err -< $DBI::errstr\n";
my $insert_animal = $dbh->prepare('INSERT INTO animal4 (name, category, type, size) VALUES (?, ?, ?, ?)');
for my $row1 ( $xp->findnodes('/database/row1s/row1') ) {
my $name = $row1->getAttribute('name');
my $category = $row1->getAttribute('category');
printf qq{Level --- row1 "name" gives: $name\n};
my @row2 = $xp->findnodes('row2s/row2', $row1);
if ( @row2 ) {
for my $row2 ( @row2 ) {
my $type = $row2->getAttribute('type');
my $size = $row2->getAttribute('size');
print qq{Level row2 "type" gives: $type\n};
print qq{Level row2 "size" gives: $size\n};
$insert_animal->execute($name, $category, $type, $size);
}
}
else {
$insert_animal->execute($name, $category, undef, undef);
}
}
Ausgabe
Level --- row1 "name" gives: fox
Level row2 "type" gives: 1
Level row2 "size" gives: 10
Level row2 "type" gives: 2
Level row2 "size" gives: 8
Level --- row1 "name" gives: horse
Level row2 "type" gives: 3
Level row2 "size" gives: 100
Level --- row1 "name" gives: bee
Level --- row1 "name" gives: wasp