Anzeige

XML Dateien zusammenführen

XML Dateien zusammenführen | PSD-Tutorials.de

Erstellt von TTron, 29.08.2008.

  1. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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 (Text):
    1.  
    2. <root>
    3.    <Eintrag1>
    4.       <Wert1>
    5.       <Wert2>
    6.       <Wert3>
    7.       usw.
    8.    </Eintrag1>
    9.    <Eintrag2>
    10.       <Wert1>
    11.       <Wert2>
    12.       <Wert3>
    13.       usw.
    14.    </Eintrag2>
    15. usw.
    16. </root>
    17.  
    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
     
    #1      
  2. CIX88

    CIX88 Aktives Mitglied

    Dabei seit:
    06.04.2006
    Beiträge:
    814
    Geschlecht:
    männlich
    Ort:
    GR
    XML Dateien zusammenführen
    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 ?
     
    #2      
  3. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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
     
    #3      
  4. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    XML Dateien zusammenführen
    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: 29.08.2008
    #4      
  5. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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:
    1. <?php
    2.  
    3. // Die beiden XML-Dateien einlesen
    4. $xml1 = simplexml_load_file("1.xml");
    5. $xml2 = simplexml_load_file("2.xml");
    6.  
    7. // Element-Baum initialisieren
    8. $data = array();
    9.  
    10. // Erste Datei durchgehen
    11. foreach($xml1->wert as $wert) {
    12.   // und jedes Element anhand seiner ID (gleiches Attribut)
    13.   // in den Element-Baum einhängen
    14.   $id = (string) $wert['gleichesattribute'];
    15.   $data[$id] = array();
    16.   // Alle Attribute in den Element-Baum übernehmen
    17.   foreach($wert->attributes() as $name => $value) {
    18.     // mit Ausnahme der ID, die ja bereits als Key existiert
    19.     if($name == "gleichesattribute") continue;
    20.     $data[$id][$name] = (string) $value;
    21.   }
    22. }
    23.  
    24. // Zweite Datei durchgehen
    25. foreach($xml2->wert as $wert) {
    26.   // und jedes Element anhand seiner ID (gleiches Attribut)
    27.   // in den Element-Baum einhängen, sofern noch nicht vorhanden
    28.   $id = (string) $wert['gleichesattribute'];
    29.   if(!isset($data[$id])) {
    30.     $data[$id] = array();
    31.   }
    32.   // Alle Attribute in den Element-Baum übernehmen
    33.   foreach($wert->attributes() as $name => $value) {
    34.     // mit Ausnahme der ID, die ja bereits als Key existiert
    35.     if($name == "gleichesattribute") continue;
    36.     $data[$id][$name] = (string) $value;
    37.   }
    38. }
    39.  
    40. // Header für XML-Ausgabe senden
    41. header("Content-type: application/xml");
    42.  
    43. // XML-Ausgabe generieren
    44. echo '<root>';
    45. // Für jedes Element im Element-Baum
    46. foreach($data as $id => $record) {
    47.   // Den XML-Tag...
    48.   echo '<wert gleichesattribute="' . $id . '" ';
    49.   // ... mit allen Attributen generieren
    50.   foreach($record as $name => $value) {
    51.     echo $name . '="' . $value . '" ';
    52.   }
    53.   echo '/>';
    54. }
    55. echo '</root>';
    56.  
    57. ?>
    Das fügt die Inhalte den passenden Werten hinzu, was ich aber habe ist das hier:

    Code (Text):
    1.  
    2. XML File 1
    3.  
    4. <AlleSpiele>
    5.   <Spielklasse>
    6.     <Name>KL Herren</Name>
    7.   </Spielklasse>
    8.   <Spiel>
    9.     <Attribut1>
    10.     <...>
    11.     <Attribut22>
    12.   </Spiel>
    13.   <Spiel>
    14.     <...>
    15.   </Spiel>
    16. usw.
    17. </AlleSpiele>
    18.  
    19.  
    20. XML-File 2
    21.  
    22. <AlleSpiele>
    23.   <Spielklasse>
    24.     <Name>KL Damen</Name>
    25.   </Spielklasse>
    26.   <Spiel>
    27.     <Attribut1>
    28.     <...>
    29.     <Attribut22>
    30.   </Spiel>
    31.   <Spiel>
    32.     <...>
    33.   </Spiel>
    34. usw.
    35. </AlleSpiele>
    36.  
    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: 30.08.2008
    #5      
  6. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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 (Text):
    1.    foreach ($xml->Spiel as $platz)
    2.  
    .. 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 (Text):
    1. <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: 02.09.2008
    #6      
  7. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    XML Dateien zusammenführen
    AW: XML Dateien zusammenführen

    Warum schade? Ist doch gut so, da hast du was gelernt...

    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...
     
    #7      
  8. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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: 02.09.2008
    #8      
  9. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    XML Dateien zusammenführen
    AW: XML Dateien zusammenführen

    Wieso von hand zusammenbauen?
     
    #9      
  10. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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
     
    #10      
  11. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    XML Dateien zusammenführen
    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?
     
    #11      
  12. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    AW: XML Dateien zusammenführen

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

    Code (Text):
    1.  
    2. <?php
    3.  
    4. $datei = 'test.xml';
    5.  
    6. if (file_exists($datei))
    7. {
    8.    $xml = simplexml_load_file($datei);  
    9.  
    10.    foreach ($xml->Spiel as $platz)
    11.    {    
    12.     $Testarray[] = array(strtotime($platz->SpielVon), date('d.m.Y.', strtotime ($platz->SpielDatum)), $platz->LigaName, date('H:i', strtotime ($platz->SpielVon)), $platz->Heim, $platz->Gast );
    13.  
    14.     }
    15. }
    16. else
    17. {
    18.    exit('Konnte Datei nicht laden.');
    19. }
    20. ?>
    21.  
    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 (Text):
    1.  
    2. foreach($Testarray as $Wert)
    3.     {
    4.         echo $Wert[1]."-" .$Wert[2]."-" .$Wert[3]."-" .$Wert[4]."-" .$Wert[5];
    5.     }
    6.  
    Gruß
    Jens
     
    Zuletzt bearbeitet: 03.09.2008
    #12      
  13. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    XML Dateien zusammenführen
    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?
     
    #13      
  14. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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
     
    #14      
  15. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    XML Dateien zusammenführen
    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...
     
    #15      
  16. TTron

    TTron Nicht mehr ganz neu hier

    Dabei seit:
    21.10.2005
    Beiträge:
    52
    XML Dateien zusammenführen
    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 (Text):
    1.  
    2.  
    3. foreach ($Testarray as $key => $row) {
    4.     $Spielzeit[$key]  = $row[0];
    5.  
    6. }
    7.  
    8. array_multisort($Spielzeit, SORT_ASC, $Testarray);
    9.  
    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
     
    #16      
x
×
×
teststefan