sql >> Base de Datos >  >> RDS >> Mysql

Perl y XPath:faltan entradas en la tabla de la base de datos

Ya tienes una explicación y una solución, pero sugiero los siguientes cambios

  • Deberías prepare el INSERT INTO instrucción SQL y luego execute dentro del bucle. do tiene una sobrecarga mucho mayor

  • El // ( descendant-or-self::node() ) La construcción XPath es costosa y debe reservarla para casos en los que no tenga idea de dónde estará el elemento dentro del documento, lo cual es muy raro. En este caso el row1 los elementos están en /database/row1s/row1 y el row2 los elementos están en row2s/row2 relativo a eso

  • Es mucho más limpio usar diferentes delimitadores si desea usar caracteres de comillas dentro de una cadena entrecomillada. Por ejemplo "My name is \"$name\"" es mucho mejor como qq{My name is "$name"}

Aquí hay una versión de su programa que puede ayudar.

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

salida

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