mehrere XML Dateien auslesen?


tryanderror

Mitglied
Als erstes ich hab so gut wie kein Plan von PHP.
Hab so ziemlich alles gelesen was hier zu XML zu finden ist, komme jetzt aber nicht mehr weiter.

Ich habe ein Verzeichnis auf dem Server in dem sich die XML Dateien befinden. Aus diesen XML Dateien benötige ich jedoch nur einzelne Einträge. Es würde mir reichen diese in ein Array zu schreiben und dann als Website ausgeben zu können.
Soweit so gut.

Ich hab es mit dem Code probiert:

Code:
 <?php
$file = "1127518465.xml";
$xml_parser = xml_parser_create();
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
$data = fread($fp, filesize($file));
fclose($fp);
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);
$params = array();
$level = array();
foreach ($vals as $xml_elem) {
if ($xml_elem['type'] == 'open') {
if (array_key_exists('attributes',$xml_elem)) {
	 list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
} else {
	 $level[$xml_elem['level']] = $xml_elem['tag'];
}
}
if ($xml_elem['type'] == 'complete') {
$start_level = 1;
$php_stmt = '$params';
while($start_level < $xml_elem['level']) {
	 $php_stmt .= '[$level['.$start_level.']]';
	 $start_level++;
}
$php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
eval($php_stmt);
}
}
echo "<pre>";
print_r ($params);
print_r ($level);
echo "</pre>";
?>php

Funktioniert auch soweit. Nur ich habe in der XML Datei jedoch mehrere Einträge von folgendem:
Code:
<Players>
<Player>
<ID>31</ID>
<Team>0</Team>
<Name>blabla</Name>
<Score>0</Score>
<Kills>0</Kills>
<Deaths>0</Deaths>
<TOP>0</TOP>
<Ping>1542</Ping>
<PL>0</PL>
<Time>1</Time>
<IP>0.0.0.0</IP>
<Damage>
</Damage>
</Player>
<Player>
<ID>1</ID>
<Team>0</Team>
<Name>blabla</Name>
<Score>0</Score>
<Kills>0</Kills>
<Deaths>0</Deaths>
<TOP>0</TOP>
<Ping>1542</Ping>
<PL>0</PL>
<Time>1</Time>
<IP>0.0.0.0</IP>
<Damage>
</Damage>
</Player>

Diese Blöcke wiederholen sich halt bei mehreren Spielern. Die Ausgabe zeigt jedoch nur einen Eintrag.
Code:
[PLAYERS] => Array([PLAYER] => Array

 
 
 


([ID] => 1

 
[TEAM] => 1
[NAME] => test
[SCORE] => 0
[KILLS] => 18
[DEATHS] => 3
[TOP] => 0
[PING] => 57
[PL] => 0
[TIME] => 5
[IP] => 0.0.0.0
[DAMAGE] => 
 

)

 
 

)

Wie bekomme ich jetzt die anderen Player auch noch in die Ausgabe bzw. in das Array?

Wie kann ich alle Dateien, die sich in dem Verzeichnis befinden, auf einmal auslesen?
- siehe rot markierte Stelle -

Vielleicht hat ja jemand einen Codeschnippsel für mich.
 

tryanderror

Mitglied
Ok, hat sich soweit erledigt, habs irgendwie hingebastelt bekommen.
Sogar auch das mit den Dateinamen und dem auslesen.

hier meine Lösung

Code:
 $file = $dateinamen[$x];
echo "Dieses ist der" . $x . ". Durchlauf ". $dateinamen[$x] . "<br>";
$xml_parser = xml_parser_create();
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
$data = fread($fp, filesize($file));
fclose($fp);
$p = xml_parser_create();
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($p, $data, $values, $idx);
xml_parser_free($p);
 
// tracking used keys
$usedKeys = array();
$deepLevel = -1;
// start a php array string (evaluated later)
$forEvalPrefix = '$xml_array';
 
// loop throught the value array
foreach ($values as $key => $val) {
	 $tagName = $val['tag']; // pass the key tag into a more friendly looking variable
	 $level = $val['level']; // idem
	 if($val['type'] == 'open') {
		 $deepLevel++; // increase deep level
		 $forEvalPrefix .= '[\''. $tagName .'\']';
 
		 // begin used keys checks to allow multidimensionatity under the same tag
		 (isset($usedKeys[$level][$tagName])) ? $usedKeys[$level][$tagName]++ : $usedKeys[$level][$tagName] = 0;
		 $forEvalPrefix .= '['. $usedKeys[$level][$tagName] .']';
	 } 
	 if($val['type'] == 'complete') {
		 ($level > $deepLevel) ? $deepLevel++ : ''; // increase $deepLevel only if current level is bigger
		 $tagValue = addslashes($val['value'] ); // format the value for evaluation as a string
		 $forEvalSuffix = '[\''. $tagName .'\'] = \''. $tagValue .'\';'; // create a string to append to the current prefix
		 $forEval = $forEvalPrefix . $forEvalSuffix; // (without "$php_used_prefix"...)
		 eval($forEval); // write the string to the array structure
	 }
	 if($val['type'] == 'close') {
		 unset($usedKeys[$deepLevel]); // Suppress tagname's keys useless
		 $deepLevel--;
		 $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the used keys node
		 $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the end level of the array string prefix
	 }
}

Also hat sich erledigt....
 

Forum-Statistiken

Themen
272.354
Beiträge
1.558.603
Mitglieder
187.825
Neuestes Mitglied
markus.frick