mysql - 如何使用 UNIX 命令行将 XML 转换为 MYSQL 插入?

标签 mysql xml bash perl unix

如果我有一个如下所示的 XML

<monsterload xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<monster>
<idLore_Monsters>99</idLore_Monsters>
<strMonsterName>Young Minotaur</strMonsterName>
<strDescription>Not quite as experienced as an older Minotaur warrior, young Minotaurs are still quite dangerous and guard their treasure with equal ferocity if not strength.</strDescription>
<intLevel>20</intLevel>
<intExp>35</intExp>
<intGold>18</intGold>
<intBaseHP>301</intBaseHP>
<intBaseMP>100</intBaseMP>
<intBaseSP>30</intBaseSP>
<intSTR>35</intSTR>
<intDEX>35</intDEX>
<intINT>0</intINT>
<intCHA>0</intCHA>
<intEND>30</intEND>
<intLUK>0</intLUK>
<strExtraData>minotaur,lean:1.5</strExtraData>
<idLore_Elements>3</idLore_Elements>
<idLore_WeaponTypes>1</idLore_WeaponTypes>
<intWeaponBaseDamage>4</intWeaponBaseDamage>
<intWeaponRandDamage>3</intWeaponRandDamage>
<intWeaponBonusToHit>12</intWeaponBonusToHit>
<intArmorFIRE>115</intArmorFIRE>
<intArmorWATER>85</intArmorWATER>
<intArmorICE>85</intArmorICE>
<intArmorWIND>130</intArmorWIND>
<intArmorEARTH>70</intArmorEARTH>
<intArmorENERGY>115</intArmorENERGY>
<intArmorLIGHT>100</intArmorLIGHT>
<intArmorDARKNESS>100</intArmorDARKNESS>
<intArmorMELEE>25</intArmorMELEE>
<intArmorRANGED>15</intArmorRANGED>
<intArmorMAGIC>15</intArmorMAGIC>
<strBodyFileName>monster-minotaur5.swf</strBodyFileName>
<strHeadFileName>monster-minotaur2-head.swf</strHeadFileName>
<idLore_Backgrounds>5</idLore_Backgrounds>
<intMaxPackSize>2</intMaxPackSize>
<dateMonsterUpdated>2013-11-18T21:15:23</dateMonsterUpdated>
<strWeaponElement>Earth</strWeaponElement>
<strWeaponType>Melee</strWeaponType>
<strBackgroundTerrain>dungeon</strBackgroundTerrain>
<strBackgroundFileName>background-dungeon2.swf</strBackgroundFileName>
<intPower>100</intPower>
<numPower>1.000000</numPower>
</monster>
</monsterload>

我可以用它来做一个 MYSQL 插入语句吗? (自动地)。我现在做的就是将其转换为csv,然后使用在线工具将csv转换为MYSQL,这非常慢。 下面是一个示例 SQL 代码,前几行:

 INSERT INTO `tablename` (`IdLore_Monsters`, `strMonsterName`, `strDescription`, `Level`))
 VALUES
(99, 'Young Minotaur', 'Not quite as experienced as an older Minotaur warrior, young Minotaurs are still quite dangerous and guard their treasure with equal ferocity if not strength.', '20');

等等

最佳答案

l0b0 是正确的。您确实应该努力自己解决这个问题,而不是仅仅希望云中某个匿名专家提供免费的解决方案。然而,在这种情况下,你很幸运,因为我喜欢编写一些代码来做到这一点。

请记住,Stack Overflow 不是一个论坛,其主要目的也不是为每个人的困难提供支持,而是建立一个常见编程问题的通用解决方案库。这意味着应该是我最不关心的问题,我应该专注于创建尽可能普遍有用的答案。考虑到这一点,当您提出问题时最好表现得更加谦虚,并且您应该首先在网站上搜索可以在您的情况下使用的以前的解决方案。

最好使用适当的 XML 解析模块来处理 XML。总是。我下面的示例显示了一个使用 XML::Twig 的解决方案,它不是核心模块,可能需要安装。

我编写了一个辅助子例程,它根据数据项是否“看起来像数字”来猜测是否应该引用该数据项。如果您使用DBI要操作数据库,最好在传递给 prepare 的 SQL 语句中使用占位符,并在调用 execute< 时提供实际值.

use strict;
use warnings;

use XML::Twig;
use Scalar::Util qw/ looks_like_number /;

my $twig = XML::Twig->new;
$twig->parsefile('monsterload.xml');

my @columns = qw/ idLore_Monsters strMonsterName strDescription intLevel /;

for my $monster ($twig->get_xpath('/monsterload/monster')) {
  printf "INSERT INTO `tablename` (%s)\nVALUES (%s)\n",
      join(', ', map "`$_`", @columns),
      join(', ', map monster_field($monster, $_), @columns);
}

sub monster_field {
  my ($monster, $field_name) = @_;

  my $value = $monster->field($field_name);
  $value = "'$value'" unless looks_like_number($value);
  $value;
}

输出

INSERT INTO `tablename` (`idLore_Monsters`, `strMonsterName`, `strDescription`, `intLevel`)
VALUES (99, 'Young Minotaur', 'Not quite as experienced as an older Minotaur warrior, young Minotaurs are still quite dangerous and guard their treasure with equal ferocity if not strength.', 20)

关于mysql - 如何使用 UNIX 命令行将 XML 转换为 MYSQL 插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27079563/

相关文章:

mysql - 在mysql中选择具有唯一字段值的行

jquery - 使用 JQuery/Javascript 从简单的 XML 中获取属性值

python - 从 xml-node 获取具有特定值的属性

SqlBulkCopy 无法尝试复制 XML 列中包含大量内容的行

bash - 了解 sed 命令语法和 sed 命令

linux - 在 docker 中运行 React 实例之前运行 bash 脚本?

bash - gnuplot for 循环和文件名中的空格

mysql - mysql数据库有更新时如何实现服务器推送?

c# - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,以了解在附近使用的正确语法

java - 如何恢复 mysql 默认模式,如 sakila