XML Compare

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo Zusammen,

    ich habe folgenden Fall:

    Über eine Online-Quelle beziehe ich ein XML-File. Diese File wurde zu Beginn des Projektes einmalig geparsed und in eine MySQL-Datenbank geschrieben.
    Nun möchte ich einen Cron erstellen, der alle X min das File erneut herunterlädt und nach Änderungen sucht (Neue Einträge oder Einträge die geändert wurden).

    Ich weiss nicht wo ich anpacken soll. Soll ich es in eine neue Tabelle einfügen und dann MySQL vergleichen, soll ich die XML-Files mit diff o.ä. parsen und das Ergebnis verwerten?

    Problem ist, dass die XML aus zirka 20.000 Einträgen à >10 Feldern besteht, da kommt ein bisschen was zusammen, da suche ich natürlich die performanteste Lösung.

    Als Plattform steht Debian4.0 zur Verfügung, von mir aus auch gerne PERL, Pyton, PHP Lösungen, die Daten werden dann eh von PHP weiter verarbeitet.

    Viele Grüße

    Felix
  • Erstelle doch mal einen hash-Code der Datei. Dann vergleichst du immer die hash-Codes und kannst so mit extrem hoher Wahrscheinlichkeit Änderungen feststellen. MD5-Hash kannst du z.B. verwenden.

    Wenn du nicht in totale Panik verfällst, wenn in ca. einer von ner Millionen Fällen (geraten, bitte informiere dich genauer über die Wahrscheinlichkeit) der Md5-Hash sagt, dass die Dateien gleich sind obwohl sie es nicht sind, sollte das die performanteste Lösung sein.
  • Tja, dann würde ich vorschlagen du gibst den Einträgen einen Timestamp, wann sie zuletzt geändert wurden.
    Das XML-Dokument lädst du dann nicht komplett in den Speicher (also kein DOM) sondern du parst den Stream mit SAX (geht nacheinander die Elemente durch, die du brauchst). Du hast bei SAX keinen wahlfreien Zugriff aber dafür braucht es nur einen Bruchteil der Zeit und des Speichers. Dann liest du den Timestamp des jeweiligen Eintrags aus. Nun weißt du ob du zum nächsten Eintrag springen kannst oder den Inhalt des Eintrags übernehmen musst. Die Timestamps musst du natürlich in deiner Datenbank speichern.