簡體   English   中英

Perl:使用LibXML將XML轉換為MySQL

[英]Perl: XML to MySQL with LibXML

我對Perl還是很陌生,我正在編寫一個perl腳本來練習,我想將XML文件中的信息解析為MySQL DB,但是我被困住了,我找不到將數據導入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。

我會重新制定你在做什么。 看起來您的賭桌是每場比賽一排,而不是一項運動每一排。

因此,您需要一個“內循環”來挑選游戲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做很多相同的事情)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM