【问题标题】:Importing XML Data into Database将 XML 数据导入数据库
【发布时间】:2015-02-09 01:31:04
【问题描述】:

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

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

【问题讨论】:

  • 您的 XML 样本对于给出一个好的答案是必要的。否则,这是一个基于意见的答案,这可能与 StackOverflow 无关。我建议将perlXML::Twig 视为XML 解析的好选择。 (如果您可以提供 XML 示例和所需的输出,我可以为您举一个示例)。

标签: mysql xml database perl xml-parsing


【解决方案1】:

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

从 9 月 14 日开始,我快速浏览了一场红袜队对皇家队的比赛。(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/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'
                },
                ...

然后,导航这些哈希并根据需要插入数据库行就很简单了。

【讨论】:

  • 播放器 XML 文件,以及可在线查看的文件似乎都是非常标准的格式,我没有看到文件之间有很多变化。问题出现在 Inning by Inning 文件中,由于某种原因似乎无法在线查看(但可以通过 perl 解析脚本以某种方式下载)。我可以添加 2 个文件进行比较,但它们又大又丑。您提供的 perl 脚本会帮助解决不一致的字段名称吗?例如:文件 1 将击球列列为 batter,文件 2 将其列为 batter22。提前致谢!
  • 也许您正在查看的文件的一些 URL 以及您正在查看的字段名称会有所帮助。我只是看了看同一场比赛的局,属性完全一致(击球手、投手等)。
  • 看了你最后的评论后,我回去检查原始数据文件,你是对的,文件本身是一致的。起初我没有意识到这一点,因为我将它们导入 Excel 以便于查看。显然,Excel 正在重命名标题行。不幸的是,我一直无法让上面的代码工作,所以我仍然卡住了。我不断收到“文件目录不存在”或“权限被拒绝”的错误消息。这是我第一次尝试 perl,所以我可能做错了。
  • 您下载了 XML 吗?您必须传入正确的文件名,或者使用 来下载它。您也可以传入一个 XML 字符串。
猜你喜欢
  • 2015-05-03
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-06-03
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多