В MySQL LOAD XML отсутствуют дочерние узлы при импорте - PullRequest
2 голосов
/ 30 октября 2011

Я пытаюсь использовать 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

.. но, к сожалению, я озадачен тем, с чего начать (эти документы действительно мало что могут объяснить), кто-нибудь может предложить несколько указателей? даже если это просто веб-страница с подходящими (и легко отслеживаемыми) примерами.

Заранее благодарен всем, кто может дать некоторые рекомендации.

Ответы [ 3 ]

0 голосов
/ 26 июля 2015

Существует реальное преимущество использования LOAD XML в скорости импорта XML в вашу базу данных. Тем не менее, существуют некоторые короткие ошибки LOAD XML, которые вы должны найти небольшие обходные пути. Два из которых вы найдете здесь.

LOAD XML не будет анализировать тег, похожий на этот ...

Он будет анализировать только тег, как ...

Поэтому вам нужно заменить строку на теге.

Нечего подобного будет достаточно ...

<?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, с вашей базой данных.

В теге есть дочерние теги. Следует сделать вывод, что это означает, что все данные в теге должны быть помещены в другую таблицу.

Это ниже не будет работать в вашем случае ... ЗАГРУЗИТЕ ЛОКАЛЬНЫЙ ИНФИЛЬ XML 'C: \ path \ to \ xmlfile \ example.xml' В СТОЛ mychildtable Строки, идентифицируемые '';

Похоже, что данные находятся в атрибутах, и поэтому 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']} )";
            }
        }
    }

?>
0 голосов
/ 18 сентября 2016

Как указано в https://dev.mysql.com/doc/refman/5.5/en/load-xml.html на примере address , вы можете попробовать это

LOAD XML LOCAL INFILE 'C:\path\to\xmlfile\example.xml'
INTO TABLE mytable
ROWS IDENTIFIED BY '<effect>';

Это должно работать, пока каждое имя тега уникально и столбецимена соответствуют именам тегов.

0 голосов
/ 12 ноября 2011

Согласно документации mysql , "load xml" не читает подузлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...