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
prepareINSERT INTOCâu lệnh SQL và sau đóexecutenó trong vòng lặp.docó 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,row1các phần tử ở/database/row1s/row1vàrow2các phần tử ởrow2s/row2liê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