XML Parser in PHP

DiDiJo

Erfahrenes Mitglied
Hi Leute,

ich habe ein Problem mit einem XML-Parser. Das bestehende Skript was ich schon vorliegen habe ist dafür da, um Immobilien in eine Datenbank einzulesen (in einem standart XML Format).

Das ganze funktioniert auch super und ich darf es nun umbauen, dass skript nicht nur dateien einliesst sondern sondern auch mit einem XML Stream zurecht kommt. Dafür muss das Skript ein wenig angepasst werden, da ich bis jetzt nur einen <Anbieter> mit vielen <immobilien> in der XML erwartet habe.

Alte XML:
Code:
<xml>
  <anbieter>
     <immobilie>
     [Objektdaten]
     </immobilie>
     <immobilie>
     [Objektdaten]
     </immobilie> 
    <immobilie>
     [Objektdaten]
     </immobilie>
  </anbieter>
</xml>

Neue XML:
Code:
<xml>
  <anbieter>
     <immobilie>
     [Objektdaten]
     </immobilie>
     <immobilie>
     [Objektdaten]
     </immobilie> 
    <immobilie>
     [Objektdaten]
     </immobilie>
  </anbieter>
  <anbieter>
     <immobilie>
     [Objektdaten]
     </immobilie>
     <immobilie>
     [Objektdaten]
     </immobilie> 
    <immobilie>
     [Objektdaten]
     </immobilie>
  </anbieter> 
 <anbieter>
     <immobilie>
     [Objektdaten]
     </immobilie>
     <immobilie>
     [Objektdaten]
     </immobilie> 
    <immobilie>
     [Objektdaten]
     </immobilie>
  </anbieter>
</xml>

Abgesehen davon, dass ich jetzt mehr als ein anbieter feld habe ist alles beim alten.

Nun habe ich mir das bestehende PHP Skript angeschaut und habe folgende Funktion entdeckt:
PHP:
	function parse($filepath)
	{
		$xmlFile = implode('', file($filepath));
				
		$encoding = 'ISO-8859-1';
		if (preg_match('/encoding..utf\-8/i', $xmlFile))
		{
			$encoding = 'UTF-8';
			$_ENV['XML_IS_UTF'] = true;
		}
		else $_ENV['XML_IS_UTF'] = false;
		
		# Entfernen des Namespaces für sauberes Parsen
		# xmlns:imo="http://www.openimmo.de"
		$nameSpaceRegex = '/xmlns([:0-9a-zA-Z_\-]+)\=.http:\/\/www.openimmo.de./';
		# Ausführen des Regulären Ausdrucks
		preg_match($nameSpaceRegex, $xmlFile, $treffer);
		if (count($treffer) && $treffer[1]){
			$noNameSpace = substr($treffer[1], 1);
			#echo "<p>Entferne Namespace: <strong>$noNameSpace</strong></p>";
			
			$xmlFile = str_replace('<'.$noNameSpace.':', '<', $xmlFile);
			$xmlFile = str_replace('</'.$noNameSpace.':', '</', $xmlFile);
		} #else echo "<p>Parsing läuft ohne Namespace-Entfernen</p>";
		
		// Username nicht ersetzen
		//echo "<pre>$xmlFile</pre>";
		//$xmlFile = str_replace('f002e923', '106', $xmlFile);
		
		//$xmlFile = file($filepath);
		$parser = xml_parser_create('');
		xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
		xml_set_element_handler($parser, array(&$this,"startElement"), array(&$this,"endElement"));
		xml_set_character_data_handler($parser, array(&$this,"cdata"));
		
		xml_parse($parser, $xmlFile);
		xml_parser_free($parser);

	}

Was dort passiert ist mir auch klar. Eine XML Datei wird in ein String umgeformt und später mit php eigenen funktionen verarbeitet (ab "$parser = xml_parser_create('');").


Diese Funktion wird so aufgerufen:
PHP:
$doc = array('root' => array(), 'immos' => array());

$XML_PARSER->parse($xtract_to.'/'.$nozip_file);
$errors = $XML_PARSER->parseForDatabase($doc, $_SESSION['id'], $xtract_to, false, $cronJob);

In der ersten Zeile von "parseForDatabase" kann ich mir ein var_dump von $doc ausgeben und habe zugriff auf die gesammte XML im Array Format
PHP:
function parseForDatabase($xml, $userid, $actpath, $update = false, $cronJob = false)
{
    var_dump($xml);

    $senderTool = trim($xml['root']['uebertragung']['attributes']['sendersoftware']);
}

Ich habe auch Zugriff auf die XML-Variablen und in $senderTool steht der richtige Wert.




So..... das erstmal zu meinem Grundaufbau. Nun will ich das ganze so erweitern, dass ich mit mehreren Anbietern pro XML Datei zurecht komme. Also habe ich mir eine nackte Seite aufgegbaut mit folgendem Inhalt:
PHP:
$xmlString = ROOT.'test-immo.xml';
$XML_PARSER->parse($xmlString);

$doc = array('root' => array(), 'immos' => array());

$errors = $XML_PARSER->parseForDatabase($doc,0,$OBJ_PARSER->XML_DIR, false, true);

Wenn ich mir nun ein var_dump von $doc ausgeben lasse, so erscheinen nur die 2 felder die ich oben auch manuell erstellt habe ... es erscheint nichts aus der XML. Ich meine das müsste ja aus meiner parse Klasse kommen (sicher bin ich mir aber nicht).


Sieht einer von euch vlt. meinen Fehler bzw. kann mir jemand den letzten Teil meiner parse klasse erklären ?!



p.s. das ganze funktioniert auch nicht mit einer "alten" XML Datei.
 
Zuletzt bearbeitet: