2016-05-13 3 views
0

私はPerlを初めて使い慣れており、XMLファイルからMySQL DBへの情報を解析したいと思っていますが、データをMySQLにインポートする方法。私は、印刷行からコメントを削除した場合、出力がされますPerl:XMLからLibXMLを使用したMySQL

+------------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+------------------+--------------+------+-----+---------+----------------+ 
| id    | int(6)  | NO | PRI | NULL | auto_increment | 
| sport_id   | varchar(255) | YES |  | NULL |    | 
| sport_name  | varchar(255) | YES |  | NULL |    | 
| competition_id | varchar(255) | YES |  | NULL |    | 
| competition_name | varchar(255) | YES |  | NULL |    | 
| game_id   | varchar(255) | YES |  | NULL |    | 
| game_start  | varchar(255) | YES |  | NULL |    | 
| game_name  | varchar(255) | YES |  | NULL |    | 
+------------------+--------------+------+-----+---------+----------------+ 

#!/usr/local/bin/perl 
use strict; 
use warnings; 
use diagnostics; 
use XML::LibXML; 
use DBI; 
my $filename = 'test.xml'; 
my $dom = XML::LibXML->load_xml(location => $filename); 
my $sport_id; 
my $sport_name; 
my $competition_id; 
my $competition_name; 
my $game_id; 
my $game_start; 
my $game_name; 
my @values; 
my $dbh = DBI->connect("dbi:mysql:parser:127.0.0.1", "root", "123qwe", { RaiseError => 1}) or die $DBI::errstr; 
my $query = 'INSERT INTO sports (sport_id,sport_name,competition_id,competition_name,game_id,game_start,game_name) VALUES (?,?,?,?,?,?,?)'; 
my $sth = $dbh->prepare($query) or die "Prepare failed: " . $dbh->errstr(); 

foreach my $test ($dom->findnodes('//Sport')) { 
    print "\n"; 
    $sport_id = $test->findvalue('./ID'); 
    $sport_name = $test->findvalue('./Name'); 
    $competition_id = $test->findvalue('./Competitions/Competition/ID'); 
    $competition_name = $test->findvalue('./Competitions/Competition/Name'); 
    $game_id = $test->findvalue('./Competitions/Competition/Games/ID'); 
    $game_start = $test->findvalue('./Competitions/Competition/Games/Start'); 
    $game_name = $test->findvalue('./Competitions/Competition/Games/Name'); 
    #print "Sport ID: $sport_id\n"; 
    #print "Sport Name: $sport_name\n"; 
    #print "Competition ID: $competition_id\n"; 
    #print "Competition Name: $competition_name\n"; 
    #print "Game ID: $game_id\n"; 
    #print "Game Start: $game_start\n"; 
    #print "Game Name: $game_name\n"; 
    #print "\n"; 
    push @values, $sport_id,$sport_name,$competition_id,$competition_name,$game_id,$game_start,$game_name; 
    $sth->execute(@values) or die $dbh->errstr; 
} 

私のXML::

<Sports> 
<Sport> 
<ID>1369527874</ID> 
<Name>Virtual Football</Name> 
<Competitions> 
<Competition> 
<ID>1374380502</ID> 
<Name>Virtual Football. World - G.Devs Stadium</Name> 
<Games> 
<ID>1974885309</ID> 
<Start>2016-05-11 12:21:00</Start> 
<Name>New England Militia - St. Louis Racers</Name> 
<ID>1974892839</ID> 
<Start>2016-05-11 12:27:00</Start> 
<Name>Las Vegas Rollers - Salt Lake Wrath</Name> 
</Games> 
</Competition> 
</Competitions> 
</Sport> 
<Sport> 
<ID>882</ID> 
<Name>Darts</Name> 
<Competitions> 
<Competition> 
<ID>1834852369</ID> 
<Name>Darts. World - PDC European Tour Outright</Name> 
<Games> 
<ID>1895020486</ID> 
<Start>2016-05-15 23:00:00</Start> 
<Name>PDC European Tour. Outright</Name> 
</Games> 
</Competition> 
</Competitions> 
</Sport> 
</Sports> 

MySQLの構造ここで

は私のPerlのコードがあります次のようになります。

Sport ID: 1369527874 
Sport Name: Virtual Football 
Competition ID: 1374380502 
Competition Name: Virtual Football. World - G.Devs Stadium 
Game ID: 19748853091974892839 
Game Start: 2016-05-11 12:21:002016-05-11 12:27:00 
Game Name: New England Militia - St. Louis RacersLas Vegas Rollers - Salt Lake Wrath 


Sport ID: 882 
Sport Name: Darts 
Competition ID: 1834852369 
Competition Name: Darts. World - PDC European Tour Outright 
Game ID: 1895020486 
Game Start: 2016-05-15 23:00:00 
Game Name: PDC European Tour. Outright 

あなたが見ることができるように、主な問題は、私は複数のゲームを持っているので、私はそれらを分割する方法を見つけるように見えるので、私はそれらをmysqlにインポートすることができます。

+0

理由だけではなく、 '//ゲームに反復しません'代わりに? – Sobrique

+0

結果は同じになります。たとえば、最初のスポーツIDは19748853091974892839の2スポーツ1974885309と1974892839のIDを含み、これらの結果を分離したいと考えています。 – user2642601

+0

ポイントは - あなたのテーブルはゲームごとに1つの行を探しているように見えますが、スポーツごとには1つではありません。 – Sobrique

答えて

2

あなたのしていることを再調整します。あなたのテーブルはゲーム 1行につき1行で、スポーツ1列ではないようです。

ゲームIDを選択するには、「内部ループ」が必要です。残念ながら - グループ化されていないので、次のような操作を行う必要があります。私はそれをよりよく知っているので、XML::Twigを使用して

- このような何か:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use XML::Twig; 

my $twig = XML::Twig->parse(\*DATA); 

foreach my $sport ($twig->findnodes('//Sport')) { 
    my %fields; 
    $fields{sport_id}   = $sport->findvalue('./ID'); 
    $fields{sport_name}  = $sport->findvalue('./Name'); 
    $fields{competition_id} = $sport->findvalue('.//Competition/ID'); 
    $fields{competition_name} = $sport->findvalue('.//Competition/Name'); 
    foreach my $game ($sport->findnodes('.//Games/ID')) { 
     $fields{game_id} = $game->text; 
     $fields{game_start} = $game->next_sibling->text; 
     $fields{game_end} = $game->next_sibling->next_sibling->text; 
     print "Fields: ", join(
      ",", 
      @fields{ 
       qw(sport_id sport_name 
        competition_id competition_name 
        game_id game_start game_end) 
      } 
      ), 
      "\n"; 
    }  
} 

(あなたがXML::LibXMLでずっと同じことを行うことができますかなり確信して)

関連する問題