Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perl dan XPath:entri yang hilang di tabel database

Anda sudah memiliki penjelasan dan perbaikan, tetapi saya menyarankan perubahan berikut

  • Anda harus prepare INSERT INTO Pernyataan SQL dan kemudian execute itu di dalam lingkaran. do memiliki overhead yang jauh lebih besar

  • // ( descendant-or-self::node() ) Konstruk XPath mahal dan Anda harus memesannya untuk kasus-kasus di mana Anda tidak tahu di mana elemen akan berada di dalam dokumen, yang sangat jarang terjadi. Dalam hal ini row1 elemen berada di /database/row1s/row1 dan row2 elemen berada di row2s/row2 relatif terhadap itu

  • Jauh lebih bersih untuk menggunakan pembatas yang berbeda jika Anda ingin menggunakan karakter kutipan dalam string yang dikutip. Misalnya "My name is \"$name\"" jauh lebih baik sebagai qq{My name is "$name"}

Ini adalah versi program Anda yang mungkin bisa membantu.

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

keluaran

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. Kolom Kesalahan Posting Fatal AJAX Tidak Bisa Null

  2. Laravel 5.6 withCount dan pernyataan where

  3. Federasi Pengguna KeyCloak DAN PERAN DINAMIS

  4. Indeks MySQL 5.0 - Unik vs Tidak Unik

  5. Apakah ada susunan utf8_unicode_cs?