我第一次尝试使用LOAD XML,并且大部分都得到了我想要的结果,因为大多数XML数据都被传输到数据库表并进入各自的列,但是两列是没有正确导入。
让我展示一个典型的XML结构的例子,所以也许你可以看到原因(这显然只是文件中的一条记录)。
注意:无法更改XML结构,这是从我的控件之外的文件中读取的,因此我必须按原样使用该结构。
<trait name="ArmorBldg_R001">
<dbid>450</dbid>
<traittype>ArmorBuilding</traittype>
<rarity>rare</rarity>
<icon>UserInterface\Icons\Equipment\ArmBuildR3_ua</icon>
<rollovertextid>53253</rollovertextid>
<displaynameid>53254</displaynameid>
<offertype>eOfferCivMatching</offertype>
<visualfactor type="Body" factor="2.0000"/>
<sellable>1</sellable>
<tradeable>1</tradeable>
<destroyable>1</destroyable>
<effects>
<effect type="Data" bonus="true" amount="1.0122" scaling="0.0031" subtype="Armor" visible="true" damagetype="Ranged" relativity="Percent">
<target type="Player"/>
</effect>
<effect type="Data" bonus="true" amount="1.0197" scaling="0.0052" subtype="Damage" visible="true" allactions="1" relativity="Percent">
<target type="Player"/>
</effect>
<effect type="Data" bonus="true" amount="1.0092" scaling="0.0023" subtype="LOS" visible="true" relativity="Percent">
<target type="Player"/>
</effect>
</effects>
</trait>
我正在使用..
导入LOAD XML LOCAL INFILE 'C:\path\to\xmlfile\example.xml'
INTO TABLE mytable
ROWS IDENTIFIED BY '<trait>';
这是表结构。
CREATE TABLE `traits` (
`name` varchar(40) NOT NULL,
`dbid` smallint(5) unsigned NOT NULL,
`traittype` varchar(40) NOT NULL,
`rarity` varchar(10) NOT NULL,
`icon` varchar(100) NOT NULL,
`rollovertextid` mediumint(8) unsigned NOT NULL,
`displaynameid` mediumint(8) unsigned NOT NULL,
`offertype` varchar(20) NOT NULL,
`visualfactor` text NOT NULL,
`sellable` tinyint(1) NOT NULL,
`tradeable` tinyint(1) NOT NULL,
`destroyable` tinyint(1) NOT NULL,
`effects` text NOT NULL,
UNIQUE KEY `dbid` (`dbid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
所有记录都正确导入,但每个记录的visualfactor
和effects
列都是空的。
我一直在阅读以下两页..
http://dev.mysql.com/doc/refman/5.5/en/load-xml.html
http://dev.mysql.com/doc/refman/5.5/en/load-data.html
..但不幸的是我对哪里开始感到困惑(那些文档真的很难解释自己),有人能提供一些指示吗?即使它只是一个包含合适(并且易于遵循)示例的网页。
提前感谢能够提供指导的任何人。
答案 0 :(得分:0)
根据mysql documentation,“load xml”不读取子节点。
答案 1 :(得分:0)
在将XML导入数据库的速度中使用LOAD XML确实很有用。但是,有一些短暂的LOAD XML,你必须找到一些解决方法。其中两个你在这里找到。
LOAD XML不会解析看起来像这样的标签......
&LT; tag /&gt;
它只会解析像...这样的标签。
&LT;标签&GT; &LT; / tag&gt;
因此,您需要在标签上进行字符串替换。
这样的东西就足够了......
<?php
$string = file_get_contents("example.xml");
$string = str_replace('<visualfactor type="Body" factor="2.0000"/>','<visualfactor type="Body" factor="2.0000"></visualfactor>',$string);
file_put_contents("example.xml", $string);
?>
查看标记,您会发现LOAD XML的另一个限制。您必须成功地将看到XML结构的父关系映射到数据库。
标签包含子标签。您应该推断这意味着标记中的所有数据都应该进入另一个表。
以下内容对您的情况不起作用...... LOAD XML LOCAL INFILE&#39; C:\ path \ to \ xmlfile \ example.xml&#39; INTO TABLE mychildtable 由&#39;&#39;;
识别的行似乎数据属于属性,因此LOAD XML不起作用。您需要解析字符串并插入它。这就是我想出来的......
<?php
$xml = simplexml_load_file("example.xml");
#assumming that the parent tag is traits??
$array = $xml->traits;
foreach($array as $h => $info){
$key = $info->dbid
$sql = "Insert Into Table `childData` (`key`,`type`,`bonus`,`amount`,`scaling`,`subtype`,`visible`,damagetype`) VALUES ";
$effectArray = $xml->effects->effect;
foreach($effectArray as $i => $effectInfo){
$data = (array) $effectInfo->attributes();
$attributes = $data['@attributes']);
If($i ==0 ){
$sql .= "('{$key}', '{$attributes['type']}', '{$attributes['bonus']}', '{$attributes['amount']', '{$attributes['scaling']}', '{$attributes['subtype']}',{$attributes['visible']},{$attribute['damagetype']} )";
}else{
$sql .= ",('{$key}', '{$attributes['type']}', '{$attributes['bonus']}', '{$attributes['amount']', '{$attributes['scaling']}', '{$attributes['subtype']}',{$attributes['visible']},{$attribute['damagetype']} )";
}
}
}
?>
答案 2 :(得分:0)
正如https://dev.mysql.com/doc/refman/5.5/en/load-xml.html中地址示例中所述,您可以试试这个
LOAD XML LOCAL INFILE 'C:\path\to\xmlfile\example.xml'
INTO TABLE mytable
ROWS IDENTIFIED BY '<effect>';
只要每个标记名称都是唯一的,并且列名对应于标记名称,它就应该有效。