[PHP] XML / array opslaan in MySQL database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • klaaz
  • Registratie: April 2000
  • Laatst online: 18-09 22:37

klaaz

it's me!

Topicstarter
Ik heb via het phpbuilder formum het volgende stukje code kunnen bemachtigen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
$tabel = "sho_products.xml";

function fetch_xml($xml,$root_level){ 

    // Read XML File 
    if(!($fp = fopen($xml, "r"))){ 
        die("IO Error $xml_file"); 
    } 
    while($chunk = fread($fp,4096)){ 
        $xml_data .= $chunk; 
    } 
     
    // Do the PHP Crap 
    $parser = xml_parser_create(); 
    xml_parse_into_struct($parser, $xml_data, &$assoc_arr, &$idx_arr); 
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); 
     
    // Setup Some VARs 
    $root_tag = $assoc_arr[$root_level]['tag'];                // Used to define starting node 
    $base_level = $root_level+1; 
    $base_tag = strtolower($assoc_arr[$base_level]['tag']); // Used to define base tag 
    $i = 0; 
    $prefix = ""; 
     
    foreach($assoc_arr as $element){ 
        if($element['tag'] != $root_tag){ 
            if(!preg_match('/^s+$/', $element['value'])){ 
                $tag = strtolower($element['tag']); 
                if($element['type'] == 'open' && $element['level'] > ($base_level+1)){ 
                    // Add Prefix's for new Tags Under Base 
                    $tag_prefix[$element['level']] = $tag; 
                } elseif($element['type'] == 'close' && $element['level'] > ($base_level+1)){ 
                    // Remove Prefix's when tags closed 
                    $tag_prefix[$element['level']] = ""; 
                } elseif($element['type'] == 'complete') { 
                    // Generate Prefix 
                    if(count($tag_prefix) > 0){ 
                        $str_prefix = ""; 
                        foreach($tag_prefix as $prefix){ 
                            if(!empty($prefix)) 
                            $str_prefix .= $prefix."_"; 
                        } 
                    } // End Prefix 
                    // Add Our Data to the Items Array 
                    $extra = ""; 
                    while(isset($items[$i][$str_prefix.$tag.$extra])){ 
                        if(empty($extra)) 
                            $extra = 1; 
                        $extra++; 
                    } 
                    $items[$i][$str_prefix.$tag.$extra] = $element['value'];
                } 
            } 
            if($tag == $base_tag){ 
                // Add Our Atttributes 
                if(isset($element['attributes']) && $element['type'] == 'open'){ 
                       $items[$i] = $element['attributes'];
                  } 
                // Start New Record 
                if($element['type'] == 'close'){ 
                    $i++; 
                } 
            } 
        } 
    } 

    return $items; 
}

$items = fetch_xml('../import/sho_products.xml', 0); 

echo '<pre>'; 
print_r($items); 
echo '</pre>';


De code parst een XML file (sho_products) naar een array. So far so good. Nu wil ik de gegevens opslaan in een bijpassende mysql tabel (vergelijkbaar met de inhoud van de XML file).

Ik kom er echter niet uit. Heb al uren lopen zoeken op GoT, Google etc. Ben een beetje blind geworden voor de oplossing vrees ik... :(

Volgens mij kan ik de conversie naar een array beter overslaan en de zaak gelijk in query's stoppen. Ik heb al van alles geprobeerd, maar kom er niet uit.

Kan iemand mij een zetje geven? :)

[ Voor 8% gewijzigd door klaaz op 26-01-2004 16:05 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
Zoek eens naar recursiviteit.

Wat jij wilt kun je op verschillende manieren oplossen, de meest eenvoudige is een tabel maken met de velden id-parentid-waarde.

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Mja, als je zo gaat beginnen kan je natuurlijk net zo goed meteen de xml in de database zetten ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28

Acties:
  • 0 Henk 'm!

  • klaaz
  • Registratie: April 2000
  • Laatst online: 18-09 22:37

klaaz

it's me!

Topicstarter
interessant artikel, echter een stapje te ver... Mijn xml is niet zo diep als in het artikel genoemd. Het gebruikt ook geen parents en nodes. Maar zeker iets om eens goed door te nemen, dank je wel!

Even terug naar het script in dit topic:
Als ik het script direct aanpas om de XML gegevens op te slaan ligt het voor de hand dit in de functie te doen. Het inserten gebeurt dan echter regel voor regel. Een andere manier is het maken van een file die alle inserts bevat, deze kan echter wel 5000 regels groot worden.

Wat is de beste manier?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
Wacht even, je hebt dus alleen een XML file als:
code:
1
2
3
4
5
<root>
  <child>iets</child>
  <child>iets</child>
  <child>iets</child>
</root>


Dan is het toch heel eenvoudig? Gewoon 5000x een insert statement, eventueel met sleep een break geven om de 100 records. Of je moet shell acces hebben tot de database server, dan kun je nog wat snellers doen.

[ Voor 44% gewijzigd door djluc op 26-01-2004 17:11 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Dan is het toch heel eenvoudig? Gewoon 5000x een insert statement, eventueel met sleep een break geven om de 100 records.
Met een sleep en een break ... :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Jakkie bah, sleeps en breaks? Shell access tot database sneller?

voor het inserten:
insert into tabelnaam (velden,velda,veldb) values(waardes1),(waardes2),( etc..)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
drm schreef op 26 januari 2004 @ 17:17:
[...]
Met een sleep en een break ... :?
Sorry, heb het engels (break=pauze) een beetje onduidelijk met het Nederlands geciombineerd, zeker door de dubbele betekenis in dit geval.

Hier heeft de TS misschien wel wat aan: http://perl.about.com/library/weekly/aa083003a.htm
Pagina: 1