0
我对Perl很新颖,我正在编写一个perl脚本来练习,并且我想将XML文件中的信息解析为MySQL DB,但是我卡住了,找不到将数据导入到MySQL的方法。Perl:使用LibXML将XML转换为MySQL
这里是我的Perl代码:
#!/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的结构:
+------------------+--------------+------+-----+---------+----------------+
| 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 | |
+------------------+--------------+------+-----+---------+----------------+
如果我从打印行删除注释输出将是如下:
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的身份证,我想分开这些结果。 – user2642601
要点是 - 你的牌桌_看起来像你每场比赛都在寻找一排,而不是每场比赛。 – Sobrique