Ya tienes una explicación y una solución, pero sugiero los siguientes cambios
-
Deberías
prepare
elINSERT INTO
instrucción SQL y luegoexecute
dentro del bucle.do
tiene una sobrecarga mucho mayor -
El
//
(descendant-or-self::node()
) La construcción XPath es costosa y debe reservarla para casos en los que no tenga idea de dónde estará el elemento dentro del documento, lo cual es muy raro. En este caso elrow1
los elementos están en/database/row1s/row1
y elrow2
los elementos están enrow2s/row2
relativo a eso -
Es mucho más limpio usar diferentes delimitadores si desea usar caracteres de comillas dentro de una cadena entrecomillada. Por ejemplo
"My name is \"$name\""
es mucho mejor comoqq{My name is "$name"}
Aquí hay una versión de su programa que puede ayudar.
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);
}
}
salida
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