2014-11-22 46 views
0

如果我有一个XML看起来像这样如何使用UNIX命令行将XML转换为MYSQL插入?

<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'); 

+0

您好,欢迎堆栈溢出。现在这个问题不太可能得到解决 - Stack Overflow不是一个编程服务。如果您有现有的代码,请将其包含在您的问题中。 – l0b0 2014-11-22 16:32:45

回答

1

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

这是好事,记住,堆栈溢出不是一个论坛,其主要目的提供每个人的困难,支持,而是建立于常见的编程普遍适用的解决方案库问题。这意味着应该是我最担心的问题,我应该把重点放在创造尽可能普遍有用的答案上。考虑到这一点,在提问时最好稍微谦虚一点,而且您应该从网站搜索以前的解决方案开始,以便在您的情况下使用。

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

我写了一个辅助子程序,根据它是否看起来像一个数字来猜测数据项是否应该被引用。如果您使用DBI来操作数据库,那么在传递到prepare的SQL语句中使用10占位符要好得多,并在调用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) 
+0

我确实用'xmllint'尝试了一些东西,我没有包含它们,因为它们不起作用。感谢您的回复,并且我明白这一点,并将在未来的问题中包含我自己的代码。但是,我认为XML到SQL插入是一个相当常见的编程事物?并且要将主题添加到您的答案中,我可以将其他XML节点添加到“@ columns”值以将所有节点转换为SQL吗? – MobilenJakob 2014-11-22 17:49:28

+0

对于XML到SQL转换的通用性你可能是正确的,但这不是我必须处理的。是的,无论您放入“@ columns”的标识符都将被传输到打印的“INSERT”语句中。尝试它会很简单!它还会为根“”元素中的每个“”元素打印新的“INSERT”语句。 – Borodin 2014-11-22 18:06:12

+0

快速搜索[此问题](http://stackoverflow.com/questions/13833568) – Borodin 2014-11-22 18:10:21