Anda sudah memiliki penjelasan dan perbaikan, tetapi saya menyarankan perubahan berikut
-
Anda harus
prepare
INSERT INTO
Pernyataan SQL dan kemudianexecute
itu di dalam lingkaran.do
memiliki overhead yang jauh lebih besar -
//
(descendant-or-self::node()
) Konstruk XPath mahal dan Anda harus memesannya untuk kasus-kasus di mana Anda tidak tahu di mana elemen akan berada di dalam dokumen, yang sangat jarang terjadi. Dalam hal inirow1
elemen berada di/database/row1s/row1
danrow2
elemen berada dirow2s/row2
relatif terhadap itu -
Jauh lebih bersih untuk menggunakan pembatas yang berbeda jika Anda ingin menggunakan karakter kutipan dalam string yang dikutip. Misalnya
"My name is \"$name\""
jauh lebih baik sebagaiqq{My name is "$name"}
Ini adalah versi program Anda yang mungkin bisa membantu.
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);
}
}
keluaran
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