Mysql 将XML数据导入数据库

Mysql 将XML数据导入数据库,mysql,xml,database,perl,xml-parsing,Mysql,Xml,Database,Perl,Xml Parsing,作为一个体育迷,我希望获取美国职业棒球大联盟网站生成的每日XML文件,并将其导入Access或MySQL数据库。我遇到的问题是,它们生成的几乎每个XML文件都与上一个略有不同。例如,一个游戏文件可能有一个名为batter23的字段,该字段位于event22旁边,而另一个文件调用它batter24并位于pitchr25旁边。我知道XML文件可能不一致,但我知道必须有一种方法将数据一致地输入数据库。是否有任何方法来标准化这些XML文件?一些代码将解析列表中的每个文件,并将它们组织成特定的样式,并为它

作为一个体育迷,我希望获取美国职业棒球大联盟网站生成的每日XML文件,并将其导入Access或MySQL数据库。我遇到的问题是,它们生成的几乎每个XML文件都与上一个略有不同。例如,一个游戏文件可能有一个名为
batter23
的字段,该字段位于
event22
旁边,而另一个文件调用它
batter24
并位于
pitchr25
旁边。我知道XML文件可能不一致,但我知道必须有一种方法将数据一致地输入数据库。是否有任何方法来标准化这些XML文件?一些代码将解析列表中的每个文件,并将它们组织成特定的样式,并为它们提供一致的字段名?目前,我首先将XML文件导入Excel工作表,在该工作表中,我将文件类型更改为CSV,但在此之后,各个文件的字段名和列位置仍然不同


我的目标是让所有文件都在一个结构中,这样我每天都可以快速地将它们导入数据库,而不必手动更改列位置或字段名。我对任何和所有的选择都持开放态度,但我在大多数语言方面的经验充其量只是新手水平,所以请原谅我缺乏知识

就XML而言,这些文件是相当标准的..,您只需了解每个文件代表什么

从9月14日开始,我快速浏览了红袜队对皇家队的比赛。(去Sox!) 2014年/2014年/2009月/2014年/gid年/2014年/bosmlb年/kcamlb年/players.xml 我可以看到奥尔蒂斯的身份证是120074

如果我在击球手中查找他的球员Id,我可以看到他在那场比赛中的数据。 (2014年/月/日14/gid 2014年9月14日bosmlb kcamlb 1/batters/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'
                },
                ...

然后,浏览这些散列并插入您喜欢的DB行就很简单了。

您的XML示例对于给出一个好的答案是必要的。否则,这是一个基于意见的答案,这可能与StackOverflow无关。我建议将
perl
XML::Twig
作为XML解析的好选项。(如果你能给出一个XML示例和所需的输出,我可以给你举个例子。)播放器XML文件和可在线查看的文件似乎都是非常标准的格式,我没有看到文件之间有很多变化。问题出现在逐局文件中,出于某种原因,这些文件似乎无法在线查看(但可以通过perl解析脚本下载)。我可以添加两个文件进行比较,但它们都相当大和丑陋。您提供的perl脚本是否有助于处理不一致的字段名?例如:文件1将电池列列列为
batter
,文件2将其列为
batter22
。提前谢谢!也许您正在查看的文件的一些URL以及您看到的字段名会有所帮助。我只是看了一下同一场比赛的局数,属性是完全一致的(击球手、投手等)。在阅读了你最后的评论后,我回去检查原始数据文件,你是对的,文件本身是一致的。起初我并没有意识到这一点,因为我正在将它们导入Excel以便于查看。显然,Excel正在重命名标题行。不幸的是,我无法让上面的代码工作,所以我仍然被卡住了。我一直收到一条错误消息“文件目录不存在”或“权限被拒绝”。这是我第一次尝试perl,所以我可能只是做错了。你下载了XML吗?您必须传入正确的文件名,或者使用下载。。您还可以传入XML字符串。