将XML数据导入数据库

时间:2015-02-09 01:31:05

标签: mysql xml database perl xml-parsing

作为我的体育书呆子,我正在寻找由美国职业棒球大联盟网站制作的每日XML文件,并将它们导入Access或MySQL数据库。我遇到的问题是,他们生成的几乎每个XML文件都与上一个略有不同。例如,一个游戏文件可能包含一个名为batter23的字段,该字段位于event22旁边,而另一个文件称为batter24,并且位于pitcher25旁边。我知道XML文件可能不一致,但我知道必须有一种方法可以始终如一地将数据导入数据库。有没有标准化这些XML文件?一些代码将解析列表中的每个文件,并将它们组织成一个特定的样式并为它们提供一致的字段名称?目前我首先将XML文件导入Excel工作表,在那里我将文件类型更改为CSV,但从那里,字段名称和列位置仍然不同于文件。

我的目标是将所有文件放在一个结构中,我可以每天将它们快速导入到数据库中,而无需手动更改列位置或字段名称。我对任何和所有选项都持开放态度,但我在大多数语言中的经验最多都是菜鸟级别,所以原谅我缺乏知识。

1 个答案:

答案 0 :(得分:2)

就XML而言,这些文件非常标准..你只需要弄清楚每个文件代表什么。

我从9月14日开始快速浏览Red Sox v Royals游戏。(Go Sox!) 在year_2014 / month_09 / day_14 / gid_2014_09_14_bosmlb_kcamlb_1 / players.xml 我可以看到Ortiz的id为120074.

如果我看着他的球员Id的击球手,我可以看到他对该比赛的统计数据。 (year_2014 / month_09 / day_14 / gid_2014_09_14_bosmlb_kcamlb_1 /打者/ 120074.xml)

继续。基本上,为了将这些文件加载​​到数据库中,您将对它们执行某种程度的处理以使其有意义。 这些ID在游戏之间似乎没有变化,但我只是粗略地看了一眼。

至于加载数据,perl中的XML :: Simple可以使用XML并非常容易地吐出perl数据结构。除非你需要更重要的东西,否则这应该包括你。

加载players.xml:

#!/bin/env perl
use strict; use warnings;

use Data::Dumper;
use XML::Simple;

my $players_xml = XMLin('players.xml');

print Dumper $xml;

给你类似的东西:

$VAR1 = {
    'venue' => 'Kauffman Stadium',
    'date' => 'September 14, 2014',
    'team' => {
        'Boston Red Sox' => {
            'id' => 'BOS',
            'player' => {
                '605141' => {
                    'avg' => '.283',
                    'team_abbrev' => 'BOS',
                    'parent_team_id' => '111',
                    'hr' => '4',
                    'team_id' => '111',
                    'status' => 'A',
                    'last' => 'Betts',
                    'rl' => 'R',
                    'parent_team_abbrev' => 'BOS',
                    'first' => 'Mookie',
                    'rbi' => '12',
                    'game_position' => '2B',
                    'num' => '50',
                    'position' => '2B',
                    'current_position' => '2B',
                    'boxname' => 'Betts',
                    'bats' => 'R',
                    'bat_order' => '1'
                },
                ...

然后可以轻松导航这些哈希并插入数据库行。