login  Naam:   Wachtwoord: 
Registreer je!
 Forum

hoe laad ik rechtstreeks een XML file in in een MySQL database? (Opgelost)

Offline dvdm - 15/01/2014 18:44
Avatar van dvdmNieuw lid Voorbeeld:
Stel Ik ontvang data via een XML bestand op een website, www.testfile.be/leden.xml en die XML file bevat volgende gegevens; naam, lidnr; club; gemeente

ik heb op mijn eigen webserever een MySQL database gemaakt met een tabel "leden" die bestaat uit volgende kolommen; naam, lidnr; club; gemeente

Kan ik via een PHP- MySQL script deze XML data in een handeling dumpen in de MySQL database tabel? Ik zocht me reeds gek maar vond tot op heden geen enkel afdoend antwoord.
Alvast dank bij voorbaat.


7 antwoorden

Gesponsorde links
Offline vinTage - 15/01/2014 18:55
Avatar van vinTage Nieuw lid simplexml

  1. <?php
  2. $xml=simplexml_load_file("note.xml");
  3. echo $xml->getName() . "<br>";
  4.  
  5. foreach($xml->children() as $child)
  6. {
  7. echo $child->getName() . ": " . $child . "<br>"; //gag naar de db
  8. }
  9. ?>
Offline Koen - 16/01/2014 07:38
Avatar van Koen PHP expert Mogelijks ben je hier iets mee: http://dev.mysq...d-xml.html.
Offline dvdm - 16/01/2014 17:23
Avatar van dvdm Nieuw lid ik heb bovenstaande script uitgetest.

dit is een deel van mijn XML bestand;
<?xml version=”1.0” encoding=”ISO-8859-1”?>
<leden>
<lid>
<naam>bart</naam>
<lidnr>1234</lidnr>
<plaats>hasselt</plaats>
<barcode>1223456781254</barcode>
</lid>
<lid>
<naam>johan</naam>
<lidnr>2345</lidnr>
<plaats>brussel</plaats>
<barcode>234567891234</barcode>
</lid>
</leden>


....en krijg ik als output;

leden
lid
lid
lid
lid
...


ik raak er maar niet aan uit...

Offline Thomas - 16/01/2014 18:03
Avatar van Thomas Moderator Eerst naar een array:
  1. <?php
  2. $xml = simplexml_load_file('test.xml');
  3.  
  4. $index = 0;
  5. $leden = array();
  6. foreach ($xml->children() as $record) {
  7. $leden[$index] = array();
  8. foreach ($record->children() as $field) {
  9. $leden[$index][$field->getName()] = $field->__toString();
  10. }
  11. $index++;
  12. }
  13. echo '<pre>'.print_r($leden, true).'</pre>'; // output not escaped!
  14. ?>


Of rechtstreeks vanuit XML naar array (stond in de user contributed notes van simple_xml):
  1. <?php
  2. $xml = simplexml_load_file('test.xml');
  3. $json = json_encode($xml);
  4. $array = json_decode($json, true);
  5. echo '<pre>'.print_r($array, true).'</pre>'; // output not escaped!
  6. ?>


Ik neem aan dat het zelf wel lukt om met een foreach loopje deze data weg te schrijven? Houd wel rekening met met character encodings (van XML enerzijds, en je database anderzijds).
Offline dvdm - 17/01/2014 12:10 (laatste wijziging 17/01/2014 15:39)
Avatar van dvdm Nieuw lid @FangorN, dank voor de laatste post, dit lukt mij nu om de data weer te geven als volgt;
Array
(
[lid] => Array
(
[0] => Array
(
[naam] => Kamiel
[lidnr] => 123456
)

[1] => Array
(
[naam] => Brigitte
[lidnr] => 654321
)

)

)

Ik zou nu graag een loop creëren waardoor ik waarden in een variabele kan stoppen en zo in de database inserten.
Hoe los ik dit best op? ik heb zeer weinig ervaring met array's en loop's.
Alvast dank om mij te helpen.
Offline Thomas - 18/01/2014 17:10 (laatste wijziging 18/01/2014 20:55)
Avatar van Thomas Moderator Let wel op de volgende zaken:
- deze import kun je slechts één keer uitvoeren, anders staan je leden zo direct dubbel in je database; ik zou dus eerst e.e.a. (uitgebreid) testen voordat je dit naar je database wegschrijft
- ook zou ik na de import het importbestand en je ledenbestand weer verwijderen van je website
- zoals al eerder aangegeven, je XML-bestand heeft een encoding (ISO-8859-1). Het is verstanding om na te gaan of de codering van je ledentabel hier op aansluit

Het onderstaande script houdt geen rekening met de mogelijkheid dat bepaalde leden al aanwezig zijn in je database.

Idealiter maak je hiervoor ook gebruik van een "transactie", dit zorgt ervoor dat ALLE wijzigingen worden doorgevoerd, of (indien er iets misgaat) GEEN ENKELE. Ook dit zit niet in het onderstaande script.

  1. <?php
  2. // lees de XML in
  3. $xml = simplexml_load_file('leden.xml');
  4. $array = json_decode(json_encode($xml), true);
  5.  
  6. // doorloop het array
  7. foreach ($array['lid'] as $lid) {
  8. // $lid bevat nu een leden-record
  9. // voer hier je query uit met behulp van $lid['naam'], $lid['lidnummer'] et cetera
  10. // omdat ik verder niet weet hoe jouw ledentabel er uitziet, zal de volgende query
  11. // waarschijnlijk niet kloppen, het is aan jou om dit kloppend te maken...
  12. // is bijvoorbeeld het lidnummer numeriek? anders moeten hier ook (enkele) quotes omheen
  13.  
  14. // bouw je query
  15. $query = "INSERT INTO leden (naam, lidnummer, gemeente) VALUES (
  16. '".mysql_real_escape_string($lid['naam'])."',
  17. ".mysql_real_escape_string($lid['lidnummer']).",
  18. '".mysql_real_escape_string($lid['plaats'])."'
  19. )";
  20.  
  21. // voer je query uit, zorg EERST dat bovenstaande query klopt!
  22. mysql_query($query) or die(mysql_error());
  23. }
  24. ?>


Zoiets dus, bovenstaande code werkt waarschijnlijk niet direct. Mocht je er hiermee niet uitkomen stel ik toch dringend voor dat je hier iemand naar laat kijken die je "in real life" kan helpen hiermee, want via een forum is dat een beetje onbegonnen werk...
Bedankt door: dvdm
Offline dvdm - 19/01/2014 12:55
Avatar van dvdm Nieuw lid @FangorN
je hebt mij fantastisch geholpen !! ik heb jou script aangepast met de effectieve tabellen en het werkt perfect !! Hartelijk dank.
Joel ook dank aan jou van harte beterschap!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.217s