आपके पास पहले से ही एक स्पष्टीकरण और एक सुधार है, लेकिन मैं निम्नलिखित परिवर्तनों का सुझाव देता हूं
-
आपको
prepare
करना चाहिएINSERT INTO
SQL कथन और फिरexecute
यह पाश के भीतर।do
बहुत बड़ा उपरि है -
//
(descendant-or-self::node()
) XPath निर्माण महंगा है और आपको इसे उन मामलों के लिए आरक्षित करना चाहिए जहां आपको पता नहीं है कि तत्व दस्तावेज़ के भीतर कहां होगा, जो बहुत दुर्लभ है। इस मामले मेंrow1
तत्व/database/row1s/row1
. पर हैं औरrow2
तत्वrow2s/row2
. पर हैं उसके सापेक्ष -
यदि आप उद्धृत स्ट्रिंग के भीतर उद्धरण वर्णों का उपयोग करना चाहते हैं, तो विभिन्न सीमांकक का उपयोग करना अधिक स्पष्ट है। उदाहरण के लिए
"My name is \"$name\""
. हैqq{My name is "$name"}
. के रूप में बहुत बेहतर है
यहां आपके कार्यक्रम का एक संस्करण है जो मदद कर सकता है।
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);
}
}
आउटपुट
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