如何使用UNIX命令行将XML转换为MYSQL insert?

如何使用UNIX命令行将XML转换为MYSQL insert?,mysql,xml,bash,perl,unix,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

如果我有这样一个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>

等等。

l0b0
是正确的。你真的应该自己努力解决这个问题,而不是简单地希望从云中的匿名专家那里得到一个免费的解决方案。然而,在这种情况下,您是幸运的,因为我喜欢编写一些代码来实现这一点

最好记住,堆栈溢出不是一个论坛,它的主要目的不是为每个人的困难提供支持,而是为常见编程问题构建一个普遍适用的解决方案库。这意味着你应该是我最不关心的问题,而我应该专注于创造一个尽可能普遍有用的答案。考虑到这一点,当你问问题时,最好表现得谦虚一点,你应该从搜索网站开始,寻找以前在你的情况下可以使用的解决方案

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

我编写了一个helper子例程,它根据数据项是否“看起来像一个数字”来猜测是否应该引用它。如果要使用来操作数据库,则最好在传递给
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)

大家好,欢迎来到Stack Overflow。目前,这个问题不太可能得到回答——堆栈溢出不是一种编程服务。如果您有现有的代码,请将其包含在您的问题中。我确实尝试了一些使用
xmllint
的方法,但没有包含它们,因为它们不起作用。感谢您的回复,我理解这一点,我将在未来的问题中包含我自己的代码。然而,我认为XML到SQL插入是一种相当常见的编程方式?为了回答您的问题,我可以将其他XML节点添加到
@columns
值中以将所有节点转换为SQL吗?关于XML到SQL转换的共性,您可能是正确的,但这不是我必须处理的问题。是的,您在
@列
中输入的任何标识符都将被传输到打印的
插入
语句中。这将是非常简单的尝试!它还将为根
元素中的每个
元素打印一个新的
INSERT
语句
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)