XML Datei in MySQL einbauen

  • Hi!

    Bin ein absoluter Anfänger und brauche dringend eure Hilfe.

    Folgendes Problem:

    Ich möchte die XML-Datei der Wikipedia Datenbank in meine SQL DB einbauen. Ich habe schon länger recherchiert, bin aber noch zu keiner Lösung gekommen.

    Wenn jemand eine Idee hat, bitte antworten!

    Und bitte nicht vergessen: Bin noch Anfänger. ;)


    Hier der Link zur XML-Datei : https://dumps.wikimedia.org/dewiki/latest/

  • Das musst du bitte etwas präziser beschreiben, unter anderem, was in den XML-Dateien zu finden ist, welche du meinst (sind ja Unmengen unter deinem Link), in welcher Form und zu welchem Zweck sie in deine Datenbank eingebaut werden soll. Soll sie dann ausgelesen werden und irgendwelche Daten auf einer Webseite anzeigen .... oder... oder? Oder einfach nur das XML-Gerüst in ein einzelnes Feld der Datenbank gespeichert werden?


    Und was dir noch einfällt und hier weiterhelfen könnte.

  • Ich weiß, dass ist ein größeres Vorhaben.

    Die Datei, die ich meine, ist die Oberste. Ich bin mir nicht 100% sicher, was sich in der XML Datei befindet. Was mein Ziel ist: Ich möchte zu nahezu jedem Wikipediaeintrag eine Kurzbeschreibung speichern, die sich auf Abruf anzeigen lässt. Der gesamte Wikipediaeintrag eines Artikels ist daher semioptimal. Wie gesagt, eine Kurzbeschreibung jedes Themas wäre das Ziel. Möglicherweise könnten die Daten in in einer Tabelle festgehalten werden. Zeile 1 der Themenname und Zeile 2 die Kurzerklärung.


    Danke für eure Hilfe.

  • Na ja, wenn du entsprechende Server-Kapazitäten hast und Zugriff auf entsprechende Tools, dann wohl nicht unbedingt. Ich hab keine Ahnung, ob ein XML-Reader (bspw. in PHP) da mitspielt.


    Musst halt erst herunterladen, dann entpacken, dann mit XML-Reader die ca. 24 Millionen Zeilen durchlaufen, die entsprechenden Tags isolieren, dann in DB schreiben.


    Jedenfalls enthält die Datei folgende Struktur. 1 einzelner <doc>-Eintrag vollständig:

  • Also gibt es keine Möglichkeit, die XML Datei automatisiert zu reduzieren? Manuell ist das ja kaum möglich.

    Ich hätte dann noch eine Frage. Muss die Datenbank auf einem Server sein oder kann ich sie auch lokal speichern, also ohne Serverressourcen? Beispielsweise auf einer Festplatte.

  • Unterm Strich kommt es immer auf das selbe heraus. Wenn das System mitspielt, geht alles... Man könnte vielleicht ein XAMPP oder ähnlich so aufbohren, dass er auch Stunden vor sich hinrödelt und brav die Datenbank befüllt.

    Anderes Problem könnte dann aber vielleicht sein, dass die Datenbank zu groß wird, um sie irgendwo anders zu verwenden oder problemlos zu importieren. Vielleicht lästiger Rattenschwanz. Hängt einfach vom Provider ab, was der erlaubt.

    Also gibt es keine Möglichkeit, die XML Datei automatisiert zu reduzieren? Manuell ist das ja kaum möglich.

    Auf meinem Linux-Rechner, der allerdings recht üppig ausgestattet ist, gelingt mir durch ein

    Code
    sed -i.bak '/<links>/,/<\/links>/d' dewiki-latest-abstract.xml

    das Entfernen der <links>...</links>-Blöcke. Sogar unerwartet schnell.


    Hinterher habe ich 620MB und sieht dann so aus

    Theoretisch geht ähnliches natürlich auch mit PHP, vielleicht preg_replace oder so. Aber noch mal, dein System muss das packen.


    Wenn du auf dem Server auch exec() in PHP verwenden darfst, wäre eine Möglichkeit

    Code
    $command = 'sed -i.bak \'/<links>/,/<\/links>/d\' dewiki-latest-abstract.xml';
    exec($command);

    -------

    Nur als Hinweis. Das

    Code
    -i.bak

    oben, wenn man Originaldatei bewahren will. Wenn man sie direkt ändern will, halt nur

    Code
    -i
  • Mit welchem Programm hast du die <links> rausgeschnitten? Vielleicht ist die Frage blöd, keine Ahnung. Kann ich die Daten auch auf der Festplatte anstatt auf einem Server in MySQL speichern?

    Und weißt du zufällig, ob die hier behandelte Datei alle Wikipedia Artikel einschließt?

    Danke


    Jedesmal, wenn ich anhand eines Programmes versuche, die Datei zu bearbeiten, wird die Datei als zu groß gemeldet.

  • Eine Datenbank ist eigentlich für Daten, nicht für Dateien gedacht

    Es geht um Extraktion spezifischer Daten aus einer XML-Datei.

    ----------------------------------

    Vorneweg: Mediawikis verfügen über eine so genannte API-Schnittstelle, die auch für Exporte verwendet werden kann. Deshalb wäre mein Vorschlag, du schaust auch mal in einem MediaWiki-Forum, ob dir jemand besser weiterhelfen kann. Ich pflege zwar auch 2 Mediawikis, aber die schaffen zum Glück nicht öffentlich und ich blieb bis jetzt verschont von Nutzung dieser API ;)


    Jedesmal, wenn ich anhand eines Programmes versuche, die Datei zu bearbeiten, wird die Datei als zu groß gemeldet.

    Eben. Deshalb habe ich unter Linux und in der Linux-Konsole das Programm "sed" verwendet (wie oben gepostet), um die <links> erst zu entfernen und damit eine kleinere Datei zu erstellen, die sich aber auch nicht ohne extreme Wartezeit öffnen lässt.

    Kann ich die Daten auch auf der Festplatte anstatt auf einem Server in MySQL speichern?

    Ab dem Moment, wo es dir gelingt, alle 2.377.925 Millionen Einträge der XML-Datei auszulesen besser: zu durchlaufen, ohne, dass sich was aufhängt, bist du vollkommen frei, als was oder wo du die abspeicherst.


    Es geht also weniger darum, ob du die aus dem XML extrahierten Daten nun gleich in eine MySQL-Datenbank ablegst oder in einer oder mehreren Dateien speicherst, sondern ob es dir gelingt, die Tausende Schleifen zu durchlaufen, ohne, dass sich das ausführende Programm aufhängt oder das Programm, dass die Daten später anzeigen soll.

    Und weißt du zufällig, ob die hier behandelte Datei alle Wikipedia Artikel einschließt?

    Keine Ahnung. Sind 2.377.925 Millionen realistisch?

    -----------

    Alles, was ich mit folgendem Sermon zum Ausdruck bringen will: Trial&Error und ein gewisses KnowHow muss man sich schon rangeschafft haben oder ranschaffen, um Lösungen für solche Probleme zu finden ;) Das können wir dir leider nicht abnehmen. Folgendes hat mich jetzt auch mehrere Stunden beschäftigt ;)


    - Ich arbeite mit Windows 10.


    - Ich habe die Datei heruntergeladen und entpackt.

    - Hatte dann eine XML-Datei, 2,5 Gigabyte, mit der ich nichts anfangen konnte, weil kein Editor sie öffnen wollte.


    - Ich habe WIN runtergefahren und mein LINUX (Debian) gestartet, was reecht lange dauert ;)


    - An der LINUX-Konsole obige "sed"-Zeile laufen lassen, um sie etwas zu verkleinern.


    - Dann unter WINDOWS den Notepad++ in der 64-bit-Variante installiert, weil der etwas größere Dateien auch kann.

    - Dort die verkleinerte Datei geöffnet, was nach 2 Kafee und etwas Abspülen dann auch ging. Um dir zu bestätigen, dass das klappte. Eine Garantie gibt es für das Öffnen-Können aber nicht.


    - Dann unten folgendes Test-Script auf meiner stinknormalen Webseite bei stinknormalem Hoster laufen lassen, um zu probieren, ob man die XML-Datei in seine Einträge zerlegen kann, egal, was man nun damit danach vorhat. Dieses Testscript versucht nur Titel und Abstract simpel in eine Textdatei zu schreiben.


    - Kann man nicht, weil sich der stinknormale Server wegen Speicherüberlauf aufhängt.


    - Dann das Script auf meinem WSL (Windows Subsystem for Linux, DEBIAN) probiert. WSL ist eine Möglichkeit unter WIndows 10 LINUX zu nutzen, ohne, dass man Windows erst runterfahren muss (https://docs.microsoft.com/en-us/windows/wsl/install-win10).


    - Das Script lief > 30 Minuten und fehlerfrei durch.


    - Zwar ist die Ergebnisdatei wieder zu groß für verlässliches Öffnen-Können am Windows, aber man könnte das Script ja auch so ändern, dass mehrere Dateien erstellt werden. Das könnten dann ja ach Dateien sein, die man problemlos in kleinen Häppchen in MySQL importieren könnte. Oder sonst was.


    - Da dieses WSL Vieles aber nicht von alleine kann, muss man sich auch etwas damit beschäftigen.


    - Resümee ist aber, es geht, wohl auch mit XAMPP, wenn der Server, egal ob WSL oder XAMPP lang genug Zeit und ausreichend Speicher hat, seine Arbeit zu beenden ;)


    Mein Test-Script, dass ich mit der schon reduzierten Datei ausprobiert habe:

    Und man könnte es ergänzen, dass es den Download und Entpacken und Verkleinern gleich mitmacht, aber eben nur... Kennen wir schon... "Wenn das ausführende System mitspielt,"

  • Danke, dass sie mir bei diesen ganzen Dingen geholfen haben! Abschließend hätte ich noch eine Frage: Wissen Sie, ob man in Java Daten per Google Suche beziehen kann? Jegliche Recherche diesbezüglich war nicht so erfolgreich.

    Ansonsten schönen Abend noch und ein frohes neues Jahr!

  • Wissen Sie, ob man in Java Daten per Google Suche beziehen kann?

    https://serpapi.com/

    Ist (happig) kostenpflichtig, weil sich G sonst selbst ins Knie schießen würde bzgl. Werbeeinnahmen. Es gibt aber eine kostenlose Testmöglichkeit.


    Glaub zwar nicht, aber wenn es um Einbindung von einer domain-spezifischen Google-Suche auf einer Webseite gehen sollte, also bspw. Suche nur auf de.wikipedia.org gibt es kostenloses Google CSE (Custom Search Engine). Allerdings mit Werbung, wie man es auch von normaler Google-Suche kennt.