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にインポートすることができます。
理由だけではなく、 '//ゲームに反復しません'代わりに? – Sobrique
結果は同じになります。たとえば、最初のスポーツIDは19748853091974892839の2スポーツ1974885309と1974892839のIDを含み、これらの結果を分離したいと考えています。 – user2642601
ポイントは - あなたのテーブルはゲームごとに1つの行を探しているように見えますが、スポーツごとには1つではありません。 – Sobrique