Avatar billede proviben Novice
28. december 2004 - 13:27 Der er 12 kommentarer og
1 løsning

xml-fil til database

Hvordan kan følgende xml-fil parses således, at respektive data overføres til databasen?

MySQL database felter:
##
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
##

xml fil: ( http://www.dummydummy.dk/data.xml )
##
<?xml version='1.0' encoding='ISO-8859-1'?>
<D0>
    <D1>
        <D2>data1</D2>
        <D3>data1</D3>
        <D4>data1</D4>
        <D5>data1</D5>
        <D6>data1</D6>
        <D7>data1</D7>
        <D8>data1</D8>
                <D9>data1</D9>
                <D10>data1</D10>
    </D1>
    <D1>
        <D2>data2</D2>
        <D3>data2</D3>
        <D4>data2</D4>
        <D5>data2</D5>
        <D6>data2</D6>
        <D7>data2</D7>
        <D8>data2</D8>
                <D9>data2</D9>
                <D10>data2</D10>
    </D1>
    <D1>
        <D2>data3</D2>
        <D3>data3</D3>
        <D4>data3</D4>
        <D5>data3</D5>
        <D6>data3</D6>
        <D7>data3</D7>
        <D8>data3</D8>
                <D9>data3</D9>
                <D10>data3</D10>
    </D1>   
</D0>
##
Avatar billede rednex Nybegynder
28. december 2004 - 15:05 #1
Hvordan skal D0 og D1 se ud i databasen ? Skal de bare indeholde XML'en fra de indlejrede elementer, eller... ?
Avatar billede rednex Nybegynder
28. december 2004 - 15:39 #2
...og er det meningen at ovenstående fil skal give 3 nye poster i databasen ? D2-10 optræder jo 3 gange, så det bliver svært at få klemt ind i 1 række.

Du må gerne lige give et eksempel på hvordan ovenstående fil skal se ud når den er lagt i databasen.
Avatar billede proviben Novice
28. december 2004 - 16:10 #3
<D0> & <D1> skal indføres med værdierne D0 & D1.

Følgende er de værdier, som databassen bør indeholde, efter at data er lagt ind;

Felternavn                Værdier   

D0:                      D0 D0 D0
D1:                      D1 D1 D1
D2 :                      data1 data2 data3
D3:                      data1 data2 data3
D4:                      data1 data2 data3
D5:                      data1 data2 data3
D6:                      data1 data2 data3
D7:                      data1 data2 data3
D8:                      data1 data2 data3
D9:                      data1 data2 data3
D10:                      data1 data2 data3
Avatar billede proviben Novice
28. december 2004 - 16:15 #4
Det skal ikke klemmes ind på 1 række, men 3 rækker, så derfor bør der jo nok tilføjes et unikt tal, fx et ekstra felt kaldet ”U1”.
Avatar billede rednex Nybegynder
28. december 2004 - 19:17 #5
OK, nu er jeg nået frem til noget. Det er ikke kønt, men det ser ud til at virke:

<?php

$GLOBALS['data'] = array();
$GLOBALS['current'] =& $GLOBALS['data'];

function startTag($parser, $name, $attribs) {
    $GLOBALS['current'][$name]['parent'] =& $GLOBALS['current'];
    $GLOBALS['current'] =& $GLOBALS['current'][$name];
}

function endTag($handler, $name) {
    $temp =& $GLOBALS['current'];
    $GLOBALS['current'] =& $temp['parent'];
    unset($temp['parent']);
}

function data($handler, $data) {
    $data = trim($data);
    if(!empty($data)) {
        $GLOBALS['current'][] = $data;
    }
}

$parser = xml_parser_create('') or die('Failed to create parser');
xml_set_element_handler($parser, 'startTag', 'endTag') or die ("Failed to set element handler");
xml_set_character_data_handler($parser, 'data') or die ("Failed to set data handler");

$fp = fopen('data.xml', 'r');
while ($xml = fread($fp, 4096))
  xml_parse($parser, $xml, feof($fp))
      or die(sprintf("XML error: %s at line %d",
          xml_error_string(xml_get_error_code($xml_parser)),
          xml_get_current_line_number($xml_parser)));

fclose($fp);

xml_parser_free($parser);

$data = $GLOBALS['data']['D0']['D1'];

foreach($data as $name => $value) {
    foreach($value as $index => $text) {
        $tempArr[$index][$name] = $text;
    }
}

$dbfields = "D0, D1, " . implode(', ', array_keys($tempArr[0]));
foreach($tempArr as $value) {

    $dbdata = implode("', '", $value);
    $sql = "INSERT INTO table ($dbfields) VALUES('D0', 'D1', '$dbdata')";
    echo $sql . "<br>\n";
}

?>
Avatar billede proviben Novice
28. december 2004 - 20:12 #6
Har du mulighed for, at justere følgende to ting, således at jeg kan afprøve scriptet.

1.)    Inkludere noget mysql connect a la:

<?php
$conn = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx");
?>

2.)    Ændre 'data.xml' til linkadressen 'http://www.dummydummy.dk/data.xml'
Avatar billede rednex Nybegynder
28. december 2004 - 23:46 #7
<?php

$GLOBALS['data'] = array();
$GLOBALS['current'] =& $GLOBALS['data'];

function startTag($parser, $name, $attribs) {
    $GLOBALS['current'][$name]['parent'] =& $GLOBALS['current'];
    $GLOBALS['current'] =& $GLOBALS['current'][$name];
}

function endTag($handler, $name) {
    $temp =& $GLOBALS['current'];
    $GLOBALS['current'] =& $temp['parent'];
    unset($temp['parent']);
}

function data($handler, $data) {
    $data = trim($data);
    if(!empty($data)) {
        $GLOBALS['current'][] = $data;
    }
}

$parser = xml_parser_create('') or die('Failed to create parser');
xml_set_element_handler($parser, 'startTag', 'endTag') or die ("Failed to set element handler");
xml_set_character_data_handler($parser, 'data') or die ("Failed to set data handler");

$fp = fopen('http://www.dummydummy.dk/data.xml', 'r');
while ($xml = fread($fp, 4096))
  xml_parse($parser, $xml, feof($fp))
      or die(sprintf("XML error: %s at line %d",
          xml_error_string(xml_get_error_code($xml_parser)),
          xml_get_current_line_number($xml_parser)));

fclose($fp);

xml_parser_free($parser);

$data = $GLOBALS['data']['D0']['D1'];

foreach($data as $name => $value) {
    foreach($value as $index => $text) {
        $tempArr[$index][$name] = $text;
    }
}

$db = mysql_connect('xxx', 'yyy', 'zzz');
mysql_select_db('xxx', $db);

$dbfields = "D0, D1, " . implode(', ', array_keys($tempArr[0]));
foreach($tempArr as $value) {

    $dbdata = implode("', '", $value);
    $sql = "INSERT INTO table ($dbfields) VALUES('D0', 'D1', '$dbdata')";
    mysql_query($sql, $db);
}

mysql_close($db);

?>
Avatar billede proviben Novice
29. december 2004 - 10:00 #8
Mange tak rednex det virker 100%, point er nu på vej. I øvrigt fint, at scriptet ligeledes virker med en større xml-fil med flere poster.

Smider gerne følgende i en ny tråd.

Såfremt, at det ikke er en fast xml.fil, men en dynamisk genereret xml-side med fuldstændig samme indhold fx:

http://www.dummydummy.dk/xmldata.php?p=dummydummy.dk&r=D0&c=XXX&s=X&p=X

- vil det så værre muligt, at scriptet kan justeres således, at det kan håndtere en sådan linkadresse, idet der ikke skal tages hensyn til de enkelte parameter, men blot, at selve siden kan parses?
Avatar billede proviben Novice
29. december 2004 - 10:01 #9
Point.
Avatar billede rednex Nybegynder
29. december 2004 - 13:24 #10
Du kan sagtens en dynamish genereret side istedet, det betyder ingenting. Du skal bare rette linie 28 til

$fp = fopen('http://www.dummydummy.dk/xmldata.php?p=dummydummy.dk&r=D0&c=XXX&s=X&p=X', 'r');
Avatar billede proviben Novice
29. december 2004 - 14:26 #11
Mange tak!
Avatar billede rednex Nybegynder
29. december 2004 - 14:32 #12
Det var så lidt :o)
Avatar billede proviben Novice
29. december 2004 - 15:20 #13
Det var nu meget for mig, i og med, at jeg så slap for en hel del triviel indtastning. Ønsker scriptet modificeret en smule, - opretter derfor en ny tråd.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester