tekst uit xml bestand in database
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 ?
http://www.php.net/manual/en/refs.xml.php
óf je gebruikt gewoon de functie explode:
je kan met de xml functies werken die ingebouwd zijn in php zelf: óf je gebruikt gewoon de functie explode:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
}
?>
$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;
}
}
?>
En nu heb je $text = ... hoe moet ik dit dan doen bij zo'n xml file ?
en je doet:
dan is:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$text[0] = 'blablabla ';
$text[1] = 'thomas</name> blablabla ';
$text[2] = 'roy</name> blabla';
?>
$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)
Gewijzigd op 06/06/2011 18:54:41 door Thomas van den Bulk
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 ?
Code (php)
nu slaat hij alles op in de array $names door dit:
$names[] = $name[0];
en dat hierboven kun je ook gebruiken voor de time ;)
Uhu snap het niet helemaal. Als ik dat doe pakt hij toch ook gewoon <name> ? Aangezien er nergens <time></time> wordt opgevraagd nu toch ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
}
}
?>
$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
Code (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
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;
}
}
?>
$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;
}
}
?>
Code (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
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;
}
}
?>
$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
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 !
Code (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
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());
}
?>
$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());
}
?>
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.
dat is raar, hij zou gewoon moeten werken...
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 !!
geen probleem ;)
Wat bijvoorbeeld als <name> vaker voorkomt?
In dit geval kennelijk niet, maar stel
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<eigenaar>
<name>jan</name>
<adres>thuis</adres>
<huisdier>
<name>fikkie</name>
</huisdier>
</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.