Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „XML Dateien zusammenführen“

TTron

Nicht mehr ganz neu hier

Hallo PSD`ler,

ich benötige mal wieder eure Hilfe ... :(


Ich habe mehrere .xml Dateien in Unterschiedlichen Verzeichnissen auf meinem Webserver, die ich per php und SimpleXML zusammmenführen möchte. Die Dateien sind alle gleich aufgebaut ...
Code:
<root>
   <Eintrag1>
      <Wert1>
      <Wert2>
      <Wert3>
      usw.
   </Eintrag1>
   <Eintrag2>
      <Wert1>
      <Wert2>
      <Wert3>
      usw.
   </Eintrag2>
usw.
</root>

Wie mache ich das? Ich bin soweit das ich weiß das die einzelnen XML Dateien eingelesen und in eine neue XML Datei geschrieben werden müssen, aber wie und wie verhindere ich doppelte Einträge, da einige Einträge in mehreren Dateien sein könnten?


Grüße
Jens
 

CIX88

Aktives Mitglied

AW: XML Dateien zusammenführen

Ich würde erst mal versuchen alle Einträge in ein Array einzulesen, doppelte Einträge raus nehmen bzw. gar nicht erst mi aufnehmen, und dann aus dem Array eine neue XML zu schreiben. Wo hängt jetzt genau das Problem ?
 

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Hmm .. das Problem hängt da, das ich nicht genau weiß wie ich das anstellen muss ... also die Daten auslesen und in ein Array packen ... und doppelte rausfinden erst recht nicht :(


Gruß
Jens
 

Christian

verpeilt & verschallert

AW: XML Dateien zusammenführen

Erster Schritt:
Hol dir die keys via array_keys lass sie durch array_unique laufen und dann hast du die UniqueKeys.
dann durch eine foreach Schleife mit der neu gewonnen Keyliste die alten keys inklusive deren Inhalte aus der alten "großen" array in ein neue überführen. fertig.

Ps. F: Warum nicht direkt array_unique anwenden? A: es kann sein, dass sich die Werte in Nichtigkeiten unterscheiden, worauf die Funktion array_unique nicht anspringen würde.
 
Zuletzt bearbeitet:

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Ok, ok .. nicht so schnell und so viele Fachbegriffe ;) ... ich habe zwar ein php Script das mit Hilfe von SimpleXML die Dateien holt und ablegt und das kann ich mehr oder weniger gut auch anpassen, aber selbst ein bauen ist eher problematisch, da bräuchte ich wohl ein Beispiel, um dann selbst weiter machen zu können ;)

Die Einträge (Eintrag 1, 2 usw.) heißen übrigens alle gleich und unterscheiden sich dann nur im Inhalt der Werte ...

*edit*
Ich habe im Selfhtml Forum etwas gefunden, was meinem Problem schon recht nah kommt ...

<root>
<wert gleichesattribute="schluessel_x" attribute_1="wert_x1" attribute_2="wert_x2"/>
<wert gleichesattribute="schluessel_y" attribute_1="wert_y1" attribute_2="wert_y2"/>
...
...
</root>

XML-File 2

<root>
<wert gleichesattribute="schluessel_x" attribute_3="wert_x3" attribute_4="wert_x4"/>
<wert gleichesattribute="schluessel_y" attribute_3="wert_y3" attribute_4="wert_y4"/>
...
...
</root>

PHP:
<?php

// Die beiden XML-Dateien einlesen
$xml1 = simplexml_load_file("1.xml");
$xml2 = simplexml_load_file("2.xml");

// Element-Baum initialisieren
$data = array();

// Erste Datei durchgehen
foreach($xml1->wert as $wert) {
  // und jedes Element anhand seiner ID (gleiches Attribut)
  // in den Element-Baum einhängen
  $id = (string) $wert['gleichesattribute'];
  $data[$id] = array();
  // Alle Attribute in den Element-Baum übernehmen
  foreach($wert->attributes() as $name => $value) {
    // mit Ausnahme der ID, die ja bereits als Key existiert
    if($name == "gleichesattribute") continue;
    $data[$id][$name] = (string) $value;
  }
}

// Zweite Datei durchgehen
foreach($xml2->wert as $wert) {
  // und jedes Element anhand seiner ID (gleiches Attribut)
  // in den Element-Baum einhängen, sofern noch nicht vorhanden
  $id = (string) $wert['gleichesattribute'];
  if(!isset($data[$id])) {
    $data[$id] = array();
  }
  // Alle Attribute in den Element-Baum übernehmen
  foreach($wert->attributes() as $name => $value) {
    // mit Ausnahme der ID, die ja bereits als Key existiert
    if($name == "gleichesattribute") continue;
    $data[$id][$name] = (string) $value;
  }
}

// Header für XML-Ausgabe senden
header("Content-type: application/xml");

// XML-Ausgabe generieren
echo '<root>';
// Für jedes Element im Element-Baum
foreach($data as $id => $record) {
  // Den XML-Tag...
  echo '<wert gleichesattribute="' . $id . '" ';
  // ... mit allen Attributen generieren
  foreach($record as $name => $value) {
    echo $name . '="' . $value . '" ';
  }
  echo '/>';
}
echo '</root>';

?>

Das fügt die Inhalte den passenden Werten hinzu, was ich aber habe ist das hier:

Code:
XML File 1

<AlleSpiele>
  <Spielklasse>
    <Name>KL Herren</Name>
  </Spielklasse>
  <Spiel>
    <Attribut1>
    <...>
    <Attribut22>
  </Spiel>
  <Spiel>
    <...>
  </Spiel>
usw.
</AlleSpiele>


XML-File 2

<AlleSpiele>
  <Spielklasse>
    <Name>KL Damen</Name>
  </Spielklasse>
  <Spiel>
    <Attribut1>
    <...>
    <Attribut22>
  </Spiel>
  <Spiel>
    <...>
  </Spiel>
usw.
</AlleSpiele>

Davon gibt es dann 10 Dateien, die alle so aufgebaut sind. Vom Prinzip her reicht es wenn ich nur die Spiele mit den Attributen in die neue Datei zusammenführen kann, aber ideal wäre der komplette Inhalt, da man so auch noch die Liga(Spielklasse) abfragen kann.

Wie kann ich den Lösungsvorschlag verändern um mein Problem zu lösen bzw. kann ich den überhaupt verwenden?


Gruß
Jens
 
Zuletzt bearbeitet:

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Schade das sonst niemand geantwortet hat. Ich habe jetztl von Hand die Dateien zusammengeführt um mal etwas weiter zu kommen und stehe schon vor dem nächsten Problem ... die Abfrage nach dem Datum.
Zur Zeit gebe ich alle Spiele über eine Foreach Schleife aus
Code:
   foreach ($xml->Spiel as $platz)
.. wie kann ich aber die Ausgabe so beschränken, das ich nur die Spiele angezeigt bekommen die in einem bestimmten Datumsbereich liegen?

Das Datum ist so als Eintrag zu jedem Spiel vorhanden:
Code:
<SpielDatum>2007-09-09T00:00:00.0000000+02:00</SpielDatum>

Ich kann es auch mit strtotime() umwandeln, aber ich bekomme es nicht so eingebaut das es funktioniert .. entweder bekomme ich weiterhin alle Einträge angezeigt oder gar keinen. Möglicherweise verstehe ich auch die Funktionsweise einer ForEach Schleife nicht ... Hat da vielleicht jemand ne Hilfestellung bzw. nen Vorschlag wie das zu lösen ist?

Grüße
Jens
 
Zuletzt bearbeitet:

Top_Gun

Aktives Mitglied

AW: XML Dateien zusammenführen

Schade das sonst niemand geantwortet hat. Ich habe jetztl von Hand die Dateien zusammengeführt um mal etwas weiter zu kommen
Warum schade? Ist doch gut so, da hast du was gelernt...

Zur Zeit gebe ich alle Spiele über eine Foreach Schleife aus
Code:
   foreach ($xml->Spiel as $platz)
.. wie kann ich aber die Ausgabe so beschränken, das ich nur die Spiele angezeigt bekommen die in einem bestimmten Datumsbereich liegen?

Das Datum ist so als Eintrag zu jedem Spiel vorhanden:
Code:
<SpielDatum>2007-09-09T00:00:00.0000000+02:00</SpielDatum>
Ich kann es auch mit strtotime() umwandeln, aber ich bekomme es nicht so eingebaut das es funktioniert .. entweder bekomme ich weiterhin alle Einträge angezeigt oder gar keinen. Möglicherweise verstehe ich auch die Funktionsweise einer ForEach Schleife nicht ... Hat da vielleicht jemand ne Hilfestellung bzw. nen Vorschlag wie das zu lösen ist?

Grüße
Jens
In der foreach Schleife wandelst du dein Datum mit strtotime() um und fragst mit ner if-Abfrage ab, ob es in >= (heute-x Tage) ist. Wenn ja, lässt du dir das ausgeben. So bekommst du dann nur die angezeigt, die in den letzten x Tagen liegen...
 

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Genau so habe ich es ja auch versucht, nur leider klappt das nicht ... ich werde das gleich noch einmal testen(hab das schon wieder gelöscht) und dann mal den Code posten .. vielleicht erkennt ja jemand einen Fehler.

Und was das "gelernt" an geht ... ich weiß nicht ob händisch zusammenkopieren unter lernen fällt ;)


*edit*
So, nach einigem hin und her geht es jetzt .. hatte etwas zu kompliziert gedacht, da ich ein Beispiel für strtotme falsch interpretiert und somit dann nen Fehler eingebaut hatte :(

Falls aber trotzdem noch jemand ne Idee oder nen Codeschnipsel hat, wie man die XML Dateien zusammenführt, dann wäre ich sehr dankbar ... denn so muss ich jetzt regelmäßig die Dateien von Hand zusammenbauen, damit die auf dem aktuellen Stand sind.


Gruß
Jens
 
Zuletzt bearbeitet:

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Na weil ich eine Zusammenführung per Script nicht hinbekommen habe ... das Problem ist dann ja auch noch die Datumsgeschichte ... die Spiele müssen in dem XML File per Hand nach Datum sortiert werden, weil es sonst bei der Ausgabe durcheinander geht :(

Wenn ich das richtig gelesen habe muss ich den Inhalt (oder die Attribute von <Spiel>) der jeweils zu einem Spiel gehört in ein Array packen und dieses Array in ein übergeordnetes Array ? Das wäre vielleicht noch ne Sache die ich hinbekommen würde .. allerdings sind Arrays nicht so meine Stärke. Aber wie kann ich dann noch die Spiele nach Datum sortieren oder nach Datum sortiert ausgeben?

Gruß
Jens
 

Top_Gun

Aktives Mitglied

AW: XML Dateien zusammenführen

  1. du erstellst ein leeres array
  2. du liest deine erste .xml
  3. der Wert von Spielname weißt du einer Variablen ($spielname) zu
  4. dann füllst du dein leeres array mit einem weiteren leeren array (mit dem namen deiner variablen hinzu) (array[$spielname[]])
  5. dieses array füllst du jetzt mit den eigentlichen Werten (array[$spielname[Attribut 1]])

das selbe machst du mit allen anderen .xml-Dateien

danach arbeitest du wie Peter_Unlustig schrieb um die doppelten Einträge auszufiltern

Nun hast du ein Array welches du mit dem sort()-Befehl auch nach dem eingetragenen Datum sortieren lassen können solltest...

Reicht das als grobe Anleitung?
 

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Danke erst einmal für die Hinweise ... ich habe gestern nach einigen Versuchen das hier zusammengebastelt:

Code:
<?php

$datei = 'test.xml';

if (file_exists($datei))
{
   $xml = simplexml_load_file($datei);   

   foreach ($xml->Spiel as $platz)
   {    
    $Testarray[] = array(strtotime($platz->SpielVon), date('d.m.Y.', strtotime ($platz->SpielDatum)), $platz->LigaName, date('H:i', strtotime ($platz->SpielVon)), $platz->Heim, $platz->Gast );

    }
}
else
{
   exit('Konnte Datei nicht laden.');
}
?>

Damit lese ich die Spiele einer Datei ein und kann sie auch ausgeben .. zumindest die einzelnen Werte ... wie das mit einer foreach Schleife geht muß ich noch mal nachlesen.

Den Platz [0] belege ich mit dem Datum, nachdem sortiert werden soll. Doppelte Einträge gibt es übrigens nicht, das habe ich überprüft! Auch sind die einzelnen Dateien schon in der richtigen Reihenfolge, nur wenn dann die anderen dazukommen paßt es nicht mehr.

Rein theoretisch könnte ich doch jetzt die nächste Datei einlesen und ebenfalls an das $Testarray anhängen, oder geht das nicht ohne weiteres? Dann sind die Spiele schon mal drin ... nur wie sortiere ich die Einträge nach dem Datum? Denn ich muss ja die Arrays mit den Attributen in dem großen Array sortieren und zwar nach dem ersten Attribut jedes Arrays, in dem das Datum steht ...
Ich habe schon versucht mir die Dokumentation zu u_sort oder multisort anzusehen, blicke da aber nicht durch wie das auf mein Problem anzuwenden ist.

Was deinen Vorschlag an geht .. ich verstehe nicht was du mit Spielname meinst ... denn JEDES Spiel heißt einfach nur "Spiel", da gibt es keine Unterscheidungen.

Php ist leider nicht so meine Stärke und Arrays schon gar nicht .. den Code habe ich gestern zusammengestrickt und er funktioniert soweit schon mal, allerdings weiß ich eben nicht ob der nun weiter zu verwenden ist oder nicht!?

*edit

vereinfachte Ausgabe der Daten habe ich jetzt so hinbekommen(wird noch formatiert):

Code:
foreach($Testarray as $Wert)
	{
		echo $Wert[1]."-" .$Wert[2]."-" .$Wert[3]."-" .$Wert[4]."-" .$Wert[5];
	}

Gruß
Jens
 
Zuletzt bearbeitet:

saila

Moderatorle

AW: XML Dateien zusammenführen

Hi,

wieviele XML-Dateien gibt es überhaupt?
Werden künftig weiter XML-Dateien generiert oder erzeugt, welche dich dazu zwingen würden erneut XML-Dateien zusammezuführen?
Könnte sich der Aufbau der XML-Dateien künftig ändern?
 

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Also es könnten von der Anzahl her im nächsten Jahr welche dazu kommen oder weg fallen. Über die Saison hinweg bleibt die Anzahl der Dateien gleich.
Ob sich der Aufbau ändert kann ich nicht sagen. Allerdings denke ich nicht das es dafür einen Grund gibt.

Soweit wie ich jetzt bin, habe ich doch nur noch das Problem die Inhalte der restlichen Dateien an mein Array anzuhängen und dann zu sortieren, oder habe ich noch etwas übersehen?

Gruß
Jens
 

Top_Gun

Aktives Mitglied

AW: XML Dateien zusammenführen

Das was du hast ist doch schonmal ok und funktioniert doch. Du musst das Auslesen jetzt nur für jede weitere .xml wiederholen.
Das bestehende Array kannst du auch erweitern mit den neuen Daten, da sollte es keine Probleme geben...
 

TTron

Nicht mehr ganz neu hier

AW: XML Dateien zusammenführen

Juhu ... es geht :D

Ich habe zwar das eine oder andere jetzt nicht verstanden, aber ich hab`s nun so zusammengebastelt das es funktioniert .. sogar die Sortierfunktion habe ich hinbekommen *freu*

Code:
foreach ($Testarray as $key => $row) {
    $Spielzeit[$key]  = $row[0];

}

array_multisort($Spielzeit, SORT_ASC, $Testarray);

Wenn also jemand noch eine Idee hat, wie der Code noch schneller wird oder sonst einen Vorschlag um das Ganze zu verbessern, dann immer her damit ;)


Gruß
Jens
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
175.158
Beiträge
2.581.869
Mitglieder
67.224
Neuestes Mitglied
Aliyah79
Oben