Archief - PHP: XML-data naar MySql-DB

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

McBr@in

Legacy Member
Ik heb een xml-bestand met volgende structuur:


<row>
<field name="id">12</field>
<field name="wagen">VW</field>
<field name="jaar">1992</field>
<field name="type">4x4</field>
<field name="brandstof">benzine</field>
</row>

Zo heb ik een heleboel <rows>. Nu is het de bedoeling dat ik uit elke row enkel de data voor id, wagen entype haal en deze in een MySql - tabel steek door gebruik te maken van een php-scriptbestandje.

Ik kan momenteel wel het id, wagen en type tonen op het scherm door gebruik te maken van volgende code:

<?php

$mblist = '';
$flag = false;

function openElement($parser, $element, $attributes) {
global $flag;
if (($element == 'field') && ($attributes['name'] == 'hgid')) $flag = true;
if (($element == 'field') && ($attributes['name'] == 'normid')) $flag = true;
if (($element == 'field') && ($attributes['name'] == 'perc_code')) $flag = true;
}

function closeElement($parser, $element) {
global $flag;
$flag = false;
}

function characterData($parser, $data) {
global $flag,$mblist;
if ($flag) $mblist[] = $data;
}

$parser = xml_parser_create();

xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($parser, "openElement", "closeElement");
xml_set_character_data_handler($parser, "characterData");

$document = file_get_contents("test.xml");
xml_parse($parser, $document);

xml_parser_free($parser);

foreach ($mblist as $value) {
echo $value.'<br/>';
}

?>


Mijn vraag is nu, hoe voeg ik elke record to aan een variabele zodat ik die kan invoegen in de databank? Of ben ik met bovenstaande code helemaal de verkeerde weg op?

Help is wanted :D

Tyfius

Legacy Member
Ik zou ten eerste dat XML document al eens aanpassen.
Code:
<row>
  <id>value</id>
  <first_name>value</first_name>
</row>
En dan gaat dat stukje van killgore zonder al te veel problemen moeten werken.

McBr@in

Legacy Member
Tyfius zei:
Ik zou ten eerste dat XML document al eens aanpassen.
Code:
<row>
  <id>value</id>
  <first_name>value</first_name>
</row>
En dan gaat dat stukje van killgore zonder al te veel problemen moeten werken.

Kan diene ni aanpassen, die wordt mij op die manier elke nacht doorgegeven en dan moet er elke nacht nen TRUNCATE gebeuren en de nieuwe data worden ingevoerd. Moest ik de structuur van de xml-file kunnen aanpassen was het inderdaad veel makkelijker geweest, maar ik moet nu zitten prutsen met die attributen e om het onderscheid te maken.

Smoerf

Legacy Member
Ik heb een simpele xml parser geschreven in javascript die data in een textarea schreef, met name sql INSERT instructies, en dan gewoon gecopy past in m'n php myadmin.

Als je wil, ik kan je de code wel doormailen of posten.

McBr@in

Legacy Member
Smoerf zei:
Ik heb een simpele xml parser geschreven in javascript die data in een textarea schreef, met name sql INSERT instructies, en dan gewoon gecopy past in m'n php myadmin.

Als je wil, ik kan je de code wel doormailen of posten.

Dat zou ik leuk vinden, mailen kan je altijd naar [email protected]

killgore

Legacy Member
Aangepast aan uw +/-:
PHP:
<?php
/*RSS URL hier ingeven*/
$rss_url = "https://www.beyondgaming.be";
$xmlObject = simplexml_load_file($rss_url);
if(!$xmlObject) die ("Fout bij het ophalen van de xml file!");

foreach($xmlObject->row as $item)
{
    $insert = "INSERT INTO table SET ";
    foreach($item->field as $field)
    {
        //hieronder tabel- en veldnamen aanpassen:
        switch($field["name"])
        {
        case "id":
            $insert .= " id=".$field;
            break;
        case "wagen":
            $insert .= ", wagen='".$field."'";
            break;
        case "jaar":
            $insert .= ", jaar=".$field;
            break;
        case "type":
            $insert .= ", type='".$field."'";
            break;
        case "brandstof":
            $insert .= ", brandstof='".$field."'";
            break;
        }
    }
    mysql_query($insert) or die(mysql_error());
}

echo "Items succesvol naar db geladen!";
?>

edit: nu kloppet wel tyfius :tongue:

edit: dit vereist wel dat rond alle row objecten een geheel staat als dit: <rows> ... </rows>

Smoerf

Legacy Member
Code:
<html>
<head>
<script>
var xmlDoc
function loadXML()
{
//load xml file
// code for IE
if (window.ActiveXObject)
  {
  xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async=false;
  xmlDoc.load("messages.xml");
  getmessage()
  }
// code for Mozilla, etc.
else if (document.implementation &&
document.implementation.createDocument)
  {
  xmlDoc= document.implementation.createDocument("","",null);
  xmlDoc.load("messages.xml");
  xmlDoc.onload=getmessage
  }
else
  {
  alert('Your browser cannot handle this script');
  }
}

function getmessage()
{
   var els = xmlDoc.getElementsByTagName("msg");
   var from = xmlDoc.getElementsByTagName("from");
   var date = xmlDoc.getElementsByTagName("date");
   var subject = xmlDoc.getElementsByTagName("subject");
   var message = xmlDoc.getElementsByTagName("content");
   for(var i = (els.length);i>=0;i--){
      var msg = message[i].firstChild.nodeValue;
      msg = msg.replace('\n', '');
      document.getElementById("entries").value += "INSERT INTO `mp_entries` VALUES('', '" + date[i].firstChild.nodeValue + ":00', '" + from[i].firstChild.nodeValue + "', '" + subject[i].firstChild.nodeValue + "', '" + msg + "', '0.0.0.0');\n";
   }
}

</script>
</head>
<body onload="loadXML()">
<textarea id="entries" rows="50" cols="100"></textarea>
</body>
</htm>

Je doet ermee wat je wilt, maar je moet wel nog wat zaken aanpassen

McBr@in

Legacy Member
Nu, ik heb het redelijk goed kunnen oplossen met de code die ik in men eerste post heb gezet. Er zit nog ergens een klein foutje in maar kan toch al inserten etc :D

Toch bedankt voor de raad.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan