【问题标题】:How do i Convert XML to MYSQL insert using the UNIX command line?如何使用 UNIX 命令行将 XML 转换为 MYSQL 插入?
【发布时间】:2015-01-20 16:09:39
【问题描述】:

如果我有一个像这样的 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');

等等

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。就目前而言,这个问题不太可能得到回答 - Stack Overflow 不是编程服务。如果您有现有代码,请将其包含在您的问题中。

标签: mysql xml bash perl unix


【解决方案1】:

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)

【讨论】:

  • 我确实用xmllint 尝试了一些东西,我没有包括它们,因为它们不起作用。感谢您的回复,我理解这一点,我将在以后的问题中包含我自己的代码。但是,我认为 XML 到 SQL 的插入是相当常见的编程事情?为了回答您的问题,我可以将其他 XML 节点添加到 @columns 值以将所有节点转换为 SQL 吗?
  • 您可能对 XML 到 SQL 转换的共性是正确的,但这不是我必须处理的事情。是的,您在@columns 中输入的任何标识符都将转移到打印的INSERT 语句中。试一试会很简单!它还将为根 &lt;monsterload&gt; 元素中的每个 &lt;monster&gt; 元素打印一个新的 INSERT 语句。
  • 快速搜索出现this question
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 2021-06-08
  • 2013-03-06
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
相关资源
最近更新 更多