Cum să importați XML în MySQL cu elemente părinte și copil? (Programare, Mysql, Xml)

Muhammad a intrebat.
a intrebat.

Folosind următoarea interogare pot citi toate <vehicle> elemente din XML și să le salvez în baza de date, dar vreau ca fiecare vehicul să stocheze și părintele său. <timestep> time astfel încât să știu din ce etapă de timp face parte.

interogare

LOAD XML LOCAL INFILE 'vehicle.xml'
INTO TABLE vehicles
ROWS IDENTIFIED BY '<vehicle>'

Am obosit să creez o tabelă timesteps în care am adăugat o coloană de timp și toate celelalte coloane, dar se obține doar ultimul vehicul din fiecare interval de timp, în timp ce eu vreau să obțin toți copiii.

O parte din XML-ul meu

<?xml version="1.0" encoding="UTF-8"?>
<fcd-export xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance" xsi_noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/fcd_file.xsd">
    <timestep time="0.00">
        <vehicle id="0" x="3654.27" y="3699.20" angle="327.39" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="21059650#7_0" slope="0.00"/>
    </timestep>
    <timestep time="1.00">
        <vehicle id="0" x="3653.49" y="3700.41" angle="327.39" type="DEFAULT_VEHTYPE" speed="1.44" pos="6.54" lane="21059650#7_0" slope="0.00"/>
        <vehicle id="1" x="2592.95" y="3497.59" angle="60.95" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="22408082_0" slope="0.00"/>
    </timestep>
    <timestep time="2.00">
        <vehicle id="0" x="3651.81" y="3703.04" angle="327.39" type="DEFAULT_VEHTYPE" speed="3.12" pos="9.66" lane="21059650#7_0" slope="0.00"/>
        <vehicle id="1" x="2595.17" y="3498.82" angle="60.95" type="DEFAULT_VEHTYPE" speed="2.54" pos="7.64" lane="22408082_0" slope="0.00"/>
        <vehicle id="2" x="4551.99" y="4411.11" angle="328.95" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="23657587_0" slope="0.00"/>
    </timestep>
    <timestep time="3.00">
        <vehicle id="0" x="3649.14" y="3707.21" angle="327.39" type="DEFAULT_VEHTYPE" speed="4.95" pos="14.61" lane="21059650#7_0" slope="0.00"/>
        <vehicle id="1" x="2599.61" y="3501.29" angle="60.95" type="DEFAULT_VEHTYPE" speed="5.08" pos="12.73" lane="22408082_0" slope="0.00"/>
        <vehicle id="2" x="4550.98" y="4412.79" angle="328.95" type="DEFAULT_VEHTYPE" speed="1.96" pos="7.06" lane="23657587_0" slope="0.00"/>
        <vehicle id="3" x="4460.55" y="5390.34" angle="58.38" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="-22975228#1_0" slope="0.00"/>
    </timestep>
    <timestep time="4.00">
        <vehicle id="0" x="3645.25" y="3713.30" angle="327.39" type="DEFAULT_VEHTYPE" speed="7.23" pos="21.83" lane="21059650#7_0" slope="0.00"/>
        <vehicle id="1" x="2605.71" y="3504.68" angle="60.95" type="DEFAULT_VEHTYPE" speed="6.98" pos="19.70" lane="22408082_0" slope="0.00"/>
        <vehicle id="2" x="4549.12" y="4415.87" angle="328.95" type="DEFAULT_VEHTYPE" speed="3.59" pos="10.66" lane="23657587_0" slope="0.00"/>
        <vehicle id="3" x="4461.94" y="5391.20" angle="58.38" type="DEFAULT_VEHTYPE" speed="1.63" pos="6.73" lane="-22975228#1_0" slope="0.00"/>
        <vehicle id="4" x="6607.38" y="6648.96" angle="238.83" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="22983344_0" slope="0.00"/>
    </timestep>
    <timestep time="5.00">
        <vehicle id="0" x="3640.37" y="3720.81" angle="326.68" type="DEFAULT_VEHTYPE" speed="8.95" pos="30.78" lane="21059650#7_0" slope="0.00"/>
        <vehicle id="1" x="2613.55" y="3509.03" angle="60.95" type="DEFAULT_VEHTYPE" speed="8.97" pos="28.67" lane="22408082_0" slope="0.00"/>
        <vehicle id="2" x="4545.93" y="4421.17" angle="328.95" type="DEFAULT_VEHTYPE" speed="6.19" pos="16.84" lane="23657587_0" slope="0.00"/>
        <vehicle id="3" x="4465.05" y="5393.11" angle="58.38" type="DEFAULT_VEHTYPE" speed="3.64" pos="10.37" lane="-22975228#1_0" slope="0.00"/>
        <vehicle id="4" x="6605.78" y="6648.00" angle="238.83" type="DEFAULT_VEHTYPE" speed="1.86" pos="6.96" lane="22983344_0" slope="0.00"/>
        <vehicle id="5" x="6028.95" y="3131.17" angle="40.09" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="264312282#1_0" slope="0.00"/>
    </timestep>
</fcd-export>

Comentarii

  • Mă îndoiesc că este posibil, deoarece rândurile identificate prin nu pot fi decât un singur identificator. Cea mai bună șansă ar putea fi să manipulați XML-ul astfel încât intervalul de timp să fie adăugat la fiecare vehicul ca atribut. –  > Por marekful.
  • @marekful Cred același lucru, dar va adăuga încă un pas la procesarea mea! –  > Por Muhammad.
1 răspunsuri
Kosh

Trebuie să aveți o coloană numită time în coloana vehicles tabel.

Oficial Documentație descrie cazul dumneavoastră:

Utilizarea unui ROWS IDENTIFICAT PRIN '<tagname>' este posibil să se importe date din același fișier XML în tabele de baze de date cu definiții diferite. Pentru acest exemplu, să presupunem că aveți un fișier numit address.xml care conține următorul XML:

<?xml version="1.0"?>

<list>
  <person person_id="1">
    <fname>Robert</fname>
    <lname>Jones</lname>
    <address address_id="1" street="Mill Creek Road" zip="45365" city="Sidney"/>
    <address address_id="2" street="Main Street" zip="28681" city="Taylorsville"/>
  </person>

  <person person_id="2">
    <fname>Mary</fname>
    <lname>Smith</lname>
    <address address_id="3" street="River Road" zip="80239" city="Denver"/>
    <!-- <address address_id="4" street="North Street" zip="37920" city="Knoxville"/> -->
  </person>

</list>

Acum creați o tabelă de adrese în baza de date de testare utilizând următoarea instrucțiune CREATE TABLE:

CREATE TABLE address (
    address_id INT NOT NULL PRIMARY KEY,
    person_id INT NULL,
    street VARCHAR(40) NULL,
    zip INT NULL,
    city VARCHAR(40) NULL,
    created TIMESTAMP
);

Pentru a importa datele din elemente în tabelul address, utilizați instrucțiunea LOAD XML prezentată aici:

mysql> LOAD XML LOCAL INFILE 'address.xml'
    ->   INTO TABLE address
    ->   ROWS IDENTIFIED BY '<address>';
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

Puteți vedea că datele au fost importate folosind o instrucțiune SELECT ca aceasta:

mysql> SELECT * FROM address;
+------------+-----------+-----------------+-------+--------------+---------------------+
| address_id | person_id | street          | zip   | city         | created             |
+------------+-----------+-----------------+-------+--------------+---------------------+
|          1 |         1 | Mill Creek Road | 45365 | Sidney       | 2007-07-24 17:37:37 |
|          2 |         1 | Main Street     | 28681 | Taylorsville | 2007-07-24 17:37:37 |
|          3 |         2 | River Road      | 80239 | Denver       | 2007-07-24 17:37:37 |
+------------+-----------+-----------------+-------+--------------+---------------------+
3 rows in set (0.00 sec)

Datele din tabelul <address> care sunt incluse în comentarii XML nu sunt importate. Cu toate acestea, deoarece există un person_id în coloana address valoarea coloanei person_id din coloana părinte <person> pentru fiecare element <address> este importată în elementul address tabel.

Comentarii

  • cazul meu este puțin diferit, dacă adaug coloana „timp” la tabelul meu, acesta va citi doar ultimul vehicul din fiecare interval de timp. –  > Por Muhammad.
  • @Muhammad, mi-am actualizat răspunsul de pe pagina de documentație, omițând părțile irelevante. Sper că vă ajută. –  > Por Kosh.
  • Mulțumesc foarte mult, de fapt am încercat asta, dar totuși obțin doar ultimul vehicul din fiecare timestep, dar totuși voi încerca mai mult dacă fac ceva greșit și vă voi anunța și vă voi arăta toate jurnalele și structura. –  > Por Muhammad.
  • în cele din urmă a funcționat, aveam nevoie de o coloană de timp în tabelul meu și apoi va include automat timpul părintelui său în fiecare element de vehicul. LOAD XML LOCAL INFILE 'vehicle.xml' INTO TABLE vehicles ROWS IDENTIFIED BY '<vehicle>', , nu am avut nevoie să creez două tabele. –  > Por Muhammad.

Tags:,