Mysql
 sql >> база данни >  >> RDS >> Mysql

Perl и XPath:липсващи записи в таблицата на базата данни

Вече имате обяснение и поправка, но предлагам следните промени

  • Трябва да 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Сортиране на заявки с числа

  2. Защо се създава GRANT USAGE при първия път, когато предоставям привилегии на потребител?

  3. Доктрина 2 DQL СЛУЧАЙ КОГАТО е в Count

  4. Изтриване на дублиращи се редове от MySql таблица

  5. MySQL преобразува изхода timediff във формат ден, час, минута, секунда