Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Perl và XPath:thiếu các mục nhập trong bảng cơ sở dữ liệu

Bạn đã có giải thích và bản sửa lỗi, nhưng tôi đề xuất những thay đổi sau

  • Bạn nên prepare INSERT INTO Câu lệnh SQL và sau đó execute nó trong vòng lặp. do có chi phí lớn hơn nhiều

  • // (descendant-or-self::node() ) Cấu trúc XPath rất đắt và bạn nên dành nó cho những trường hợp bạn không biết phần tử sẽ ở đâu trong tài liệu, điều này rất hiếm. Trong trường hợp này, row1 các phần tử ở /database/row1s/row1row2 các phần tử ở row2s/row2 liên quan đến điều đó

  • Sẽ gọn gàng hơn nhiều nếu bạn sử dụng các dấu phân cách khác nhau nếu bạn muốn sử dụng các ký tự trích dẫn trong một chuỗi được trích dẫn. Ví dụ:"My name is \"$name\"" tốt hơn nhiều so với qq{My name is "$name"}

Đây là phiên bản chương trình của bạn có thể hữu ích.

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

đầu ra

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. Làm cách nào để thêm ràng buộc kiểm tra trong quá trình di chuyển Rails?

  2. Nút xóa không hoạt động trong CodeIgniter

  3. Làm cách nào để thực hiện di chuyển trong laravel 5.5?

  4. Mã lỗi MySQL:1193. Biến hệ thống không xác định

  5. mysql phù hợp / chống lại