Vous avez déjà une explication et un correctif, mais je suggère les modifications suivantes
-
Vous devez
prepare
leINSERT INTO
Instruction SQL puisexecute
dans la boucle.do
a des frais généraux beaucoup plus importants -
Le
//
(descendant-or-self::node()
) La construction XPath est coûteuse et vous devez la réserver aux cas où vous n'avez aucune idée de l'emplacement de l'élément dans le document, ce qui est très rare. Dans ce cas, larow1
les éléments sont à/database/row1s/row1
et larow2
les éléments sont àrow2s/row2
par rapport à cela -
Il est beaucoup plus propre d'utiliser différents délimiteurs si vous souhaitez utiliser des guillemets dans une chaîne entre guillemets. Par exemple
"My name is \"$name\""
est bien meilleur queqq{My name is "$name"}
Voici une version de votre programme qui pourrait vous aider.
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);
}
}
sortie
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