MySQL LOAD XML导入时缺少子节点

时间:2011-10-30 04:37:06

标签: mysql xml import nodes

我第一次尝试使用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;

所有记录都正确导入,但每个记录的visualfactoreffects列都是空的。

我一直在阅读以下两页..

http://dev.mysql.com/doc/refman/5.5/en/load-xml.html
http://dev.mysql.com/doc/refman/5.5/en/load-data.html

..但不幸的是我对哪里开始感到困惑(那些文档真的很难解释自己),有人能提供一些指示吗?即使它只是一个包含合适(并且易于遵循)示例的网页。

提前感谢能够提供指导的任何人。

3 个答案:

答案 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>';

只要每个标记名称都是唯一的,并且列名对应于标记名称,它就应该有效。