Mysql
 sql >> Base de données >  >> RDS >> Mysql

Perl et XPath :entrées manquantes dans la table de la base de données

Vous avez déjà une explication et un correctif, mais je suggère les modifications suivantes

  • Vous devez prepare le INSERT INTO Instruction SQL puis execute dans la boucle. do a des frais généraux beaucoup plus importants

  • Le // ( descendant-or-self::node() ) La construction XPath est coûteuse et vous devez la réserver aux cas où vous n'avez aucune idée de l'emplacement de l'élément dans le document, ce qui est très rare. Dans ce cas, la row1 les éléments sont à /database/row1s/row1 et la row2 les éléments sont à row2s/row2 par rapport à cela

  • Il est beaucoup plus propre d'utiliser différents délimiteurs si vous souhaitez utiliser des guillemets dans une chaîne entre guillemets. Par exemple "My name is \"$name\"" est bien meilleur que qq{My name is "$name"}

Voici une version de votre programme qui pourrait vous aider.

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);
   }
}

sortie

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