# XML Datei auslesen



## nordi (16. Juni 2006)

Hi Leute,

hab eine kleine Frage. Hab schon im Forum gesucht, bin aber nicht ganz schlau draus geworden. Also sollte eigentlich ganz einfach sein. Ich hab ne XML-Datei, die ich mich PHP einlesen will ( Mit nem "Durchsuchen"-Button" ) und die soll dann in ne Tabelle ausgelesen werden. Die XML Datei ist so aufgebaut


```
<record id="0">
	<value1>88</value1>
	<value2>301</value2>
	<value3>New City</value3>
	<value4>Bote</value4>
	<value5>bla</value5>
	<value6>blub</value6>
	</record>
...
```

Hab schon erfahren, dass ich die "parsen" muss - aber wie mach ich das?

Wünsch euch ein schönes Wochenende und viel Spaß beim Fuppes 

Marius


----------



## daddz (16. Juni 2006)

Hast du schonmal in der PHP-Dokumentation gesucht?

greetz
daddz


----------



## nordi (16. Juni 2006)

werd da nicht ganz schlau raus, wie ich hier im Bsp: die "value1" auslese...


----------



## forsterm (16. Juni 2006)

nordi hat gesagt.:
			
		

> Hab schon erfahren, dass ich die "parsen" muss - aber wie mach ich das?


Hallo,
du könntest auch mit Regulären Ausdrücken arbeiten.

EDIT:
Hier ein Beispiel. Da ich nicht sicher war, ob die ids nur Zahlen sind, hab ich es so programmiert, dass theoretisch
die ids auch aus Buchstaben bestehen können.
Also ich habe folgenden XML Datei

```
<record id="null">
	<value1>88</value1>
	<value2>301</value2>
	<value3>New City</value3>
	<value4>Bote</value4>
	<value5>bla</value5>
	<value6>blub</value6>
</record>
<record id="eins">
	<VALUE1>99</VALUE1>
	<VALUE2>412</VALUE2>
	<VALUE3>New City1</VALUE3>
	<VALUE4>Bote1</VALUE4>
	<VALUE5>blabla</VALUE5>
	<VALUE6>blubblub</VALUE6>
	<VALUE7>bsdfsdflubblub</VALUE7>
</record>
```
verwendet.
Du solltest also folgende Ausgabe

```
Array
(
    [null] => Array
        (
            [value1] => 88
            [value2] => 301
            [value3] => New City
            [value4] => Bote
            [value5] => bla
            [value6] => blub
        )

    [eins] => Array
        (
            [VALUE1] => 99
            [VALUE2] => 412
            [VALUE3] => New City1
            [VALUE4] => Bote1
            [VALUE5] => blabla
            [VALUE6] => blubblub
            [VALUE7] => bsdfsdflubblub
        )

)
```
erhalten, wenn du dieses Script verwendest.

```
<pre>
<?php
    preg_match_all('/<record id="([0-9a-zA-Z]+)">(.*?)<\/record>/si', file_get_contents('test.xml'), $result);
    foreach ($result[1] as $id){
        $ids[] = $id;
    }
    $i = 0;
    foreach ($result[2] as $value){
        preg_match_all('/<(.*?)>(.*?)<\/(.*?)>/si', $value, $inhalt);
        $arr[] = array_combine($inhalt[1], $inhalt[2]);
        $i++;
    }
    print_r(array_combine($ids, $arr));
?>
</pre>
```
Aus diesem Array kannst du dier dann z.B. eine Tabelle erstellen lassen.

EDIT2:

So könntest du das ganze z.B. in einer Tabelle ausgeben lassen.

```
<?php
    preg_match_all('/<record id="([0-9a-zA-Z]+)">(.*?)<\/record>/si', file_get_contents('test.xml'), $result);
    foreach ($result[1] as $id){
        $ids[] = $id;
    }
    $i = 0;
    foreach ($result[2] as $value){
        preg_match_all('/<(.*?)>(.*?)<\/(.*?)>/si', $value, $inhalt);
        $arr[] = array_combine($inhalt[1], $inhalt[2]);
        $i++;
    }
    echo '<table border="1" bordercolor="#000000" width="100%" style="border-collapse: collapse">';
    foreach (array_combine($ids, $arr) as $key => $value){
        echo '<tr><td align="center" colspan="2">ID = '.$key.'</td></tr>';
        foreach ($value as $k => $v){
            echo '<tr><td align="center">'.$k.'</td><td align="center">'.$v.'</td></tr>';
        }
        echo '<tr><td colspan="2">&nbsp;</td></tr>';
	}
    echo '</table>';
?>
```

mfg
forsterm


----------



## nordi (17. Juni 2006)

Und wo ladt ich da die XML Datei rein? Per Include?


----------



## forsterm (17. Juni 2006)

nordi hat gesagt.:
			
		

> Und wo ladt ich da die XML Datei rein? Per Include?


Hallo,
nein, die XML Datei wird mit [phpf]file_get_contents[/phpf] ausgelesen und dann mir Regulären Ausdrücken "zerlegt".

mfg
forsterm


----------



## nordi (24. Juni 2006)

Also hab deinen Code einfach mal bei mir reinkopiert - aber es kommt garkeine ausgabe?


```
<?php


    preg_match_all('/<record id="([0-9a-zA-Z]+)">(.*?)<\/record>/si', file_get_contents('output.xml'), $result);
    foreach ($result[1] as $id){
        $ids[] = $id;
    }
    $i = 0;
    foreach ($result[2] as $value){
        preg_match_all('/<(.*?)>(.*?)<\/(.*?)>/si', $value, $inhalt);
        $arr[] = array_combine($inhalt[1], $inhalt[2]);
        $i++;
    }
    echo '<table border="1" bordercolor="#000000" width="100%" style="border-collapse: collapse">';
    foreach (array_combine($ids, $arr) as $key => $value){
        echo '<tr><td align="center" colspan="2">ID = '.$key.'</td></tr>';
        foreach ($value as $k => $v){
            echo '<tr><td align="center">'.$k.'</td><td align="center">'.$v.'</td></tr>';
        }
        echo '<tr><td colspan="2">&nbsp;</td></tr>';
    }
    echo '</table>';
?>
```


```
<?xml version="1.0" encoding="WINDOWS-1251" ?>
<kum_data>
	<dataset>
	<record id="0">
	<value1>88</value1>
	<value2>301</value2>
	<value3>New City</value3>
	<value4>Bote</value4>
	<value5></value5>
	<value6></value6>
	</record>
	<record id="1">
	<value1>250</value1>
	<value2>220</value2>
	<value3>Traverse</value3>
	<value4>dean</value4>
	<value5>-A-</value5>
	<value6>32</value6>
	</record>
	<record id="2">
	<value1>403</value1>
	<value2>580</value2>
	<value3>New City</value3>
	<value4>Aribeth</value4>
	<value5></value5>
	<value6></value6>
	</record> [...]
```

Hast du ne Idee, woran das liegen könnte?


----------



## Flex (24. Juni 2006)

Ich lege dir mal diesen Link ans Herz:
http://de3.php.net/simplexml

Setzt allerdings PHP5 voraus...


----------



## forsterm (24. Juni 2006)

nordi hat gesagt.:
			
		

> Also hab deinen Code einfach mal bei mir reinkopiert - aber es kommt garkeine ausgabe?


 Hallo,
hab jetzt das ganze mal genau mit den gleichen Dateien ausprobiert, die du auch verwendet hast und hab folgende Ausgabe erhalten:


Eventuell bekommst du eine Fehlermeldung, wenn du PHPs Fehlersensibilität erhöst.

```
<?php
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
?>
```
mfg
forsterm


----------



## nordi (24. Juni 2006)

forsterm: Muss der Server irgendwelche Voraussetzungen erfüllen? Auch mit der Erhöhung der Fehlersensibilität bekomme ich keine Ausgabe


----------



## forsterm (24. Juni 2006)

nordi hat gesagt.:
			
		

> forsterm: Muss der Server irgendwelche Voraussetzungen erfüllen? Auch mit der Erhöhung der Fehlersensibilität bekomme ich keine Ausgabe


Hallo,
hab gerade auf php.net gelesen, dass die  [phpf]array_combine[/phpf] Funktion PHP 5
voraussetzt. Ansonsten sollte es keine besonderen Voraussetzungen geben.
Welche PHP Version hast du den?

mfg
forsterm


----------



## daddz (24. Juni 2006)

Falls dein Server nicht mit PHP5 laufen sollte kannst du auch die Funktionen aus den Kommentaren benutzen.

greetz
daddz


----------



## nordi (25. Juni 2006)

Hab grad mal geguckt - hab leider kein PHP5 - kann ich das selber nachinstallieren? PHPINFO


----------



## forsterm (25. Juni 2006)

nordi hat gesagt.:
			
		

> Hab grad mal geguckt - hab leider kein PHP5 - kann ich das selber nachinstallieren? PHPINFO





			
				daddz hat gesagt.:
			
		

> Falls dein Server nicht mit PHP5 laufen sollte kannst du auch die Funktionen aus den Kommentaren benutzen.
> 
> greetz
> daddz




```
if (!function_exists('array_combine')) {
   function array_combine($a, $b) {
       $c = array();
       if (is_array($a) && is_array($b))
           while (list(, $va) = each($a))
               if (list(, $vb) = each($b))
                   $c[$va] = $vb;
               else
                   break 1;
       return $c;
   }
}
```


----------



## Gumbo (25. Juni 2006)

Mein verbesserter Vorschlag zu Forsterms Vorschlag:
	
	
	



```
if( !function_exists('array_combine') ) {
	function array_combine($keys, $values)
	{
		if( !is_array($keys) || !is_array($values) || count($keys) == 0 || count($keys) != count($values) ) {
			return false;
		}

		$array = array();
		while( list(, $key) = each($keys) && list(, $value) = each($values) ) {
			$array[$key] = $value;
		}

		return $array;
	}
}
```


----------



## nordi (25. Juni 2006)

Ist das jetzt auf "mein" Script bezogen? Wenn ja, was macht das und wo setze ich das ein? Würde gern verstehen wie das funktioniert!


----------



## forsterm (25. Juni 2006)

nordi hat gesagt.:
			
		

> Ist das jetzt auf "mein" Script bezogen? Wenn ja, was macht das und wo setze ich das ein? Würde gern verstehen wie das funktioniert!


Hallo,
die Funktion [phpf]array_combine[/phpf] gibt es erst ab PHP 5. Man kann sich diese, jedoch auch selber nachbauen, sollte PHP 5 nicht zur Verfügung stehen.
Das Script von Gumbo überprüft als Erstes, ob die Funktion existiert wenn das nicht der Fall ist, wird sie "erstellt".

mfg
forsterm


----------



## nordi (26. Juni 2006)

Und wo setze ich das ein? Mir wird das langsam hier zu hoch


----------



## Gumbo (27. Juni 2006)

Erst einmal solltest du dich mit dem Kapitel über die Steuerung von Dateiuploads beschäftigen, damit die hochgeladene, temporäre Datei auch richtig gespeichert wird. Danach kannst mit der file_get_contents()-Funktion den Inahtl gespeicherte Datei auslesen und anschließend verarbeiten. SimpleXML scheint dabei die einfachste Lösung zu sein, setzt jedoch PHP 5 voraus.


----------

