Bạn đã có giải thích và bản sửa lỗi, nhưng tôi đề xuất những thay đổi sau
-
Bạn nên
prepare
INSERT INTO
Câu lệnh SQL và sau đóexecute
nó trong vòng lặp.do
có chi phí lớn hơn nhiều -
//
(descendant-or-self::node()
) Cấu trúc XPath rất đắt và bạn nên dành nó cho những trường hợp bạn không biết phần tử sẽ ở đâu trong tài liệu, điều này rất hiếm. Trong trường hợp này,row1
các phần tử ở/database/row1s/row1
vàrow2
các phần tử ởrow2s/row2
liên quan đến điều đó -
Sẽ gọn gàng hơn nhiều nếu bạn sử dụng các dấu phân cách khác nhau nếu bạn muốn sử dụng các ký tự trích dẫn trong một chuỗi được trích dẫn. Ví dụ:
"My name is \"$name\""
tốt hơn nhiều so vớiqq{My name is "$name"}
Đây là phiên bản chương trình của bạn có thể hữu ích.
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);
}
}
đầu ra
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