XML-Datei mit variablem Dateinamen mit PHP einlesen

tantehorst

Grünschnabel
Hallo Zusammen!

Ich habe ein kleines PHP-Script geschrieben, welches bestimmte Attribute aus einer XML einliest und in einer MySQL Datenbank speichert, sofern der Eintrag nicht schon einmal in DB vorhanden ist. Das klappt auch soweit wunderbar.
Im Script setze ich voraus, dass der Dateiname immer kostenstelle.xml lautet. Tatsächlich ist es aber so, dass ich Dateien variablem Dateinamen einlesen möchte. Der Dateiname setzt sich immer aus einem Zeitstempel und einem weiteren Atrribut zusammen.
Beispiel 151120121508-1182.xml.

Meine Fragen
1. Wie muss eine Abfrage aussehen, um diese immer anders benannte XML-Datei auszulesen?
2. Gibt es weiter die Möglichkeit die XML-Datei im Anschluss an einen anderen Ort zu verschieben, sobald sie einmal vom Script abgearbeitet wurde?

Im folgenden das Script:

PHP:
<?php

// Verbindung aufbauen, auswählen einer Datenbank
mysql_connect("xxxxxxxx","xxxxxxxxxx","xxxxxxxxx");
mysql_select_db("xxxxxxxxx") or die ("Die Datenbank existiert nicht.");


//Überprüfung ob Datei vorhanden. 
	if(file_exists('kostenstelle.xml'))
		{
		echo "Datei vorhanden";
		$xml = simplexml_load_file('kostenstelle.xml');	
		}
			
	
	echo "<br/>";
		// Ausgabe der Tags, der vom Haupttag <kostenstelle> eingeschlossem sind, Einzelausgabe der Arrays und Objekte
		//echo '<pre>';
		//print_r($xml);
		//echo '</pre>';
		//Abfrage der Daten aus dem XML-File, <kostenstelle> ist das allumschließende Element		
		for ( $i=0; $i < count($xml); $i++)
		{
		//Übergeben der XML Daten in Variabeln
		$id			=		$xml->Fahrzeug[$i]->ID;
		$fahrzeug	=		$xml->Fahrzeug[$i]->Name;
		$Abt		=		$xml->Fahrzeug[$i]->Abt;
		// Zähler für doppelte Einträge
		$doppelt  =		0;
		// Anzeige der gespeicherten Variablen
		echo $id . "<br/>";
		echo $fahrzeug . "<br/>";
		echo $Abt . "<br/>";

			$query		=	"SELECT externalID FROM kostenstelle";
			$ergebnis	=	mysql_query($query);
			
			//Abfragen der bereits vorhandene externen ID`s aus der Datenbank
			while ($row = mysql_fetch_object($ergebnis))
			{
				//Wenn externe ID gleich ID aus XML dann Datensatz ablehnen
				if ($row->externalID == $id)
						{
						echo "Bereits vorhanden " . $row->externalID . "<br/>";
						$doppelt++;
						}
			}
			//Außerhalb der While-Schleife werden die nicht doppelt vorhandenen ID`s in Datenbank geschrieben
		if ($doppelt < 1)
			{
				$insert		= 	"INSERT INTO kostenstelle (externalID,Name,Abt) VALUES ('$id','$fahrzeug','$Abt')";
				$eintrag	=	mysql_query($insert);		
			}		

		}
		
?>
 
1) überall wo du kostenstelle.xml stehen hast, muss die Variable mit dem neuen Dateinamen drin stehen

PHP:
// Irgendwoher den neuen Namen nehmen Du weisst da besser woher er kommt
$xmlfile = "abc.xml";
if(file_exists($xmlfile)){
    ... 
    $xml = simplexml_load_file($xmlfile);
    ...
}

2) mit rename()] kannst du die Datei verschieben
 
Erst mal vielen Dank für die Antwort.

Mmmmh...ich glaube ich habe mich missverständlich ausgdrückt.

Szenario: In einem Abstand von, sagen wir fünf Minuten, werden immer wieder neue XML Dateien abgelegt.
141120121440-4546.xml
141120121445-1236.xml
etc.

In Deinem Beispiel ist der Variable $xmlfile ja immer fest der Wert abc.xml zugeordnet. Ich möchte ja gerne "*.xml" einlesen.
 
Mit glob() alle Dateinamen auslesen und nachher abarbeiten

PHP:
$files = glob('*.xml');
foreach($files as $xmlfile){
    //TODO Mach mit $xmlfile was auch immer du damit machen willst
    //Dann verschieben
    rename($xmlfile, $neuerOrdner);
}
 
Hallo. :)

Du kannst es ähnich wie mit Gutschein-Codes machen.

Wenn die XML-Datei erstellt wird, dann soll das Skript den Dateinamen wie z.B. 141120121440-4546 oder 141120121445-1236 in der Datenbank speichern. In einer extra Spalte wird dann z.B. das Wort "Neu" miteingetragen.

Beispiel:
| 141120121440-4546 | Alt |
| 141120121445-1236 | Neu |

Wenn die XML-Datei nun weiter verarbeitet werden soll, dann prüfst du erst in der Datenbank welche XML-Datei Neu und welche Alt sind. Die alten werden ignoriert und die neuen weiter verarbeitet.

Alle Dateien die Neu sind, kannst du dann in ein Array laden und hast somit alle Dateinamen in einem Array.

Die weiter bearbeiteten Dateinamen müsst du zum Schluss dann nur noch als Alt markieren.

So ähnlich würde ich es machen.

Edit:

Wenn der Dateiname wirklich immer das aktuelle Datum ist, kannst du nachst ein Cronjob laufen lassen, der die Datenbank leert.
 
Zuletzt bearbeitet:
Letztlich würde ich die StammDB aufbauen, einmal alles einlesen, was existiert, dabei auf Duplikate checken. Danach gibt es alte oder neue Dateien für das Script nicht mehr, es wird einfach nur jene Datei mit dem neuesten Erstellungsdatum bzw. "größten" Namen eingelesen und wiedermals gegen die existierenden Daten gegengeprüft/eingetragen.

Oder man lässt nur jene Dateien zu, wo Datum/Zeit im Dateinamen nicht älter als 5Min (bzw. Cronjobintervall) ist - Bingo, abzuarbeitende Datei gefunden.

Diese Tabelle mit den Dateinamen und Attribut alt/neu ist eigentlich unnötig.

mfg chmee
 
Hallo!

Nach einigen anderen Sachen habe ich mich mal wieder dem Thema XML-Einlesen gewidmet.
Die Idee von Yaslaw gefällt mir eigentlich am besten.
Duplikate werden meinerseits durch ein separates Script schon vermieden. Da besteht keine Gefahr.
Allerdings funktioniert diese rename() Funktion bei mir nicht.

1. Habe ich den Pfad(e) falsch angeben?
2. die checkfile.php die den nachstehenden Code enthält liegen im gleichen Ordner wie die eingehenden XML's. Zumindest noch ist das der Fall.
3. Müssen noch entsprechende CHMOD gesetzt werden?

PHP:
<?php

$files 			= 	glob('*.xml');
	 		

foreach($files as $xmlfile)
{
	
	
	echo $xmlfile . "<br/>";
	$ziel			=	"/backup/".$xmlfile; 
	echo $ziel . "<br/>";
	rename($xmlfile, $ziel);
	
}    
?>

th
 
Zuletzt bearbeitet:
Zurück