tekst uit xml bestand in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roy Marijnissen

Roy Marijnissen

06/06/2011 17:34:46
Quote Anchor link
Ik heb een xml bestand met veel informatie. Nu wil ik de tekst die tussen <name></name> staat in een database hebben. De name tags komen honderden keren voor dus handmatig is niet mogelijk. Is er een mogelijkheid dat een php script alle namen tussen die tags in een database zet ?
 
PHP hulp

PHP hulp

17/11/2024 22:44:25
 
Thomas van den Bulk

Thomas van den Bulk

06/06/2011 18:36:47
Quote Anchor link
je kan met de xml functies werken die ingebouwd zijn in php zelf: http://www.php.net/manual/en/refs.xml.php

óf je gebruikt gewoon de functie explode:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$text
= 'text in file (bijv met fread)';
$text = explode('<name>', $text);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $name = explode('</name>', $var);
        $name = $name[0];
        // $name hier in database zetten
    } else {
        $first = true;
    }
}

?>
 
Roy Marijnissen

Roy Marijnissen

06/06/2011 18:44:55
Quote Anchor link
A oke, thanks ! Wat bedoel je eigenlijk precies met dat de eerste niet kan worden gebruikt ? Dit hoeft toch niet ?
En nu heb je $text = ... hoe moet ik dit dan doen bij zo'n xml file ?
 
Thomas van den Bulk

Thomas van den Bulk

06/06/2011 18:53:25
Quote Anchor link
als je een text hebt zoals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$text
= 'blablabla <name>thomas</name> blablabla <name>roy</name> blabla';
?>

en je doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$text
= explode('<name>', $text);
?>

dan is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$text
[0] = 'blablabla ';
$text[1] = 'thomas</name> blablabla ';
$text[2] = 'roy</name> blabla';
?>

in $text[0] staat geen naam, dus moet je die overslaan :P


en je kan de xml file uitlezen met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$filename
= 'jouwxmlfile';
$file = fopen($filename, 'r');
$text = fread($file, filesize($filename));
fclose($file);
?>
Gewijzigd op 06/06/2011 18:54:41 door Thomas van den Bulk
 
Roy Marijnissen

Roy Marijnissen

06/06/2011 20:07:06
Quote Anchor link
Thanks ! Het is me gelukt. Heb alleen nog even 1 vraagje. Nu wil ik eigenlijk ook de tekst die tussen <time></time> staat. Hoe kan ik het nu doen dat hij die 2 onderdelen inleest en apart houd zodat ik ze in de database kan zetten ?
 
Thomas van den Bulk

Thomas van den Bulk

06/06/2011 20:41:17
Quote Anchor link
je kan ook alles opslaan in een array:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$text
= explode('<name>', $text);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $name = explode('</name>', $var);
        $names[] = $name[0];
    }
else {
        $first = true;
    }
}

?>

nu slaat hij alles op in de array $names door dit:
$names[] = $name[0];
en dat hierboven kun je ook gebruiken voor de time ;)
 
Roy Marijnissen

Roy Marijnissen

06/06/2011 21:08:32
Quote Anchor link
Uhu snap het niet helemaal. Als ik dat doe pakt hij toch ook gewoon <name> ? Aangezien er nergens <time></time> wordt opgevraagd nu toch ?
 
Thomas van den Bulk

Thomas van den Bulk

07/06/2011 13:04:12
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$text
= 'text in file (bijv met fread)';
// als je slim bent sla je dit nu (vanwege de time) in een andere variabele op,
// zodat je niet 2 keer het bestand hoeft te lezen


$text = explode('<time>', $text);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $time = explode('</time>', $var);
        $time = $time[0];
        // $time hier in database zetten
    } else {
        $first = true;
    }
}

?>

nu werkt ie voor time
 
Roy Marijnissen

Roy Marijnissen

07/06/2011 13:27:21
Quote Anchor link
Ik snap nog steeds niet hoe je die nu allebij kan doen. Eentje lukt wel zoals hieronder maar wat moet ik precies toevoegen om de <time> ook te laten werken ?:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

$host
= 'localhost';  
$user = 'user';
$pass = 'pass';
$db = 'database';

mysql_connect($host,$user,$pass) or die(error_melding('Verbindingsfout', 'ja', 'De verbinding met de database is mislukt.'));
mysql_select_db($db) or die(error_melding('Verbindingsfout', 'ja', 'Het selecteren van de database is mislukt.'));


$filename = 'test.xml';
$file = fopen($filename, 'r');
$text = fread($file, filesize($filename));
fclose($file);
$text = explode('<name>', $text);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $name = explode('</name>', $var);
        $name = $name[0];
        
        
    $query="INSERT INTO list (name) ";  
    $query .= "VALUES ('"; // let op positie van de enkele aanhalingstekens
    $query .= "$name" ."');" ;
    $result = mysql_query($query) or die ("FOUT: " . mysql_error());  




    }
else {
        $first = true;
    }
}


?>
 
Thomas van den Bulk

Thomas van den Bulk

07/06/2011 13:35:54
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

$host
= 'localhost';  
$user = 'user';
$pass = 'pass';
$db = 'database';

mysql_connect($host,$user,$pass) or die(error_melding('Verbindingsfout', 'ja', 'De verbinding met de database is mislukt.'));
mysql_select_db($db) or die(error_melding('Verbindingsfout', 'ja', 'Het selecteren van de database is mislukt.'));


$filename = 'test.xml';
$file = fopen($filename, 'r');
$xml = fread($file, filesize($filename));
fclose($file);
$text = explode('<name>', $xml);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $name = explode('</name>', $var);
        $name = $name[0];      
    $query="INSERT INTO list (name) VALUES ('".$name."')";
    $result = mysql_query($query) or die ("FOUT: " . mysql_error());  
    }
else {
        $first = true;
    }
}

$text = explode('<time>', $xml);
foreach($text as $var){
    if($first == false){ // omdat we m hierboven op true hebben gezet draai ik het nu om, nu moet hij false zijn om door te gaan
        $time = explode('</time>', $var);
        $time = $name[0];      
    $query="INSERT INTO list (time) VALUES ('".$time."')"; // ik ga ervan uit dat ik hier gewoon time kan gebruiken?
    $result = mysql_query($query) or die ("FOUT: " . mysql_error());  
    }
else {
        $first = false;
    }
}

?>



dit zou moeten werken,
ook moet je oppassen voor mysql injections, als het een xml is die je niet kent, dan kan diegene dit misbruiken
 
Roy Marijnissen

Roy Marijnissen

07/06/2011 13:45:13
Quote Anchor link
Helaas werkt dat nog niet goed. Nu krijg je dus als er b.v. 10 names en 10 times staan dat ik eerst 10x de names in de db krijg zonder times en daaronder 10 times zonder names. Het moet dus in de db wel bij elkaar worden gezet en dat gebeurt nu nog niet !
 
Thomas van den Bulk

Thomas van den Bulk

07/06/2011 13:54:34
Quote Anchor link
beter?: :P
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

$host
= 'localhost';  
$user = 'user';
$pass = 'pass';
$db = 'database';

mysql_connect($host,$user,$pass) or die(error_melding('Verbindingsfout', 'ja', 'De verbinding met de database is mislukt.'));
mysql_select_db($db) or die(error_melding('Verbindingsfout', 'ja', 'Het selecteren van de database is mislukt.'));


$filename = 'test.xml';
$file = fopen($filename, 'r');
$xml = fread($file, filesize($filename));
fclose($file);
$text = explode('<name>', $xml);
foreach($text as $var){
    if($first == true){ // de eerste kan niet worden gebruikt dus slaan we de eerste over
        $name = explode('</name>', $var);
        $names[] = $name[0];
    }
else {
        $first = true;
    }
}

$text = explode('<time>', $xml);
foreach($text as $var){
    if($first == false){ // omdat we m hierboven op true hebben gezet draai ik het nu om, nu moet hij false zijn om door te gaan
        $time = explode('</time>', $var);
        $times[] = $time[0];  
    }
else {
        $first = false;
    }
}

for($i = 0; $i < count($names); $i++){
    $query="INSERT INTO list (name, time) VALUES ('".$names[$i]."', '".$times[$i]."')";
    $result = mysql_query($query) or die ("FOUT: " . mysql_error());  
}

?>
 
Roy Marijnissen

Roy Marijnissen

07/06/2011 14:03:58
Quote Anchor link
Bijna, nu pakt hij <time> niet goed. de 1e gaat goed. bij de 2e krijg ik te veel info en de 3e is weer goed. daarna blijft het leeg. Dit was bij de versie hiervoor niet het geval, toen werkt het wel goed.
 
Thomas van den Bulk

Thomas van den Bulk

07/06/2011 14:13:28
Quote Anchor link
dat is raar, hij zou gewoon moeten werken...
 
Roy Marijnissen

Roy Marijnissen

07/06/2011 14:18:29
Quote Anchor link
Oeps het werkt wel ! Had een foutje gemaakt. had times[] veranderd in time[] en dat was dus fout. Het werkt prima nu. Super super bedankt voor al je hulp !!
 
Thomas van den Bulk

Thomas van den Bulk

07/06/2011 14:19:14
Quote Anchor link
geen probleem ;)
 
Ivo P

ivo P

07/06/2011 14:25:42
Quote Anchor link
het is opzich wel handig om juist wél de xml functies van php te gebruiken.
Wat bijvoorbeeld als <name> vaker voorkomt?
In dit geval kennelijk niet, maar stel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<eigenaar>
  <name>jan</name>
  <adres>thuis</adres>
  <huisdier>
    <name>fikkie</name>
  </huisdier>
</eigenaar>


Je script is dan in een keer niet meer bruikbaar.
Het is een kwartiertje werk om simplexml functies te leren begrijpen en daarna heb je er een hoop gemak van.

Ook bijvoorbeeld als <name> zou veranderen in <name id="1"> oid.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.