Datenbankabfrage mit loop

Hallo,

ich bin ein kompletter JAVA-Anfänger und habe ein Problem, bei dem ich nicht weiterkomme. Vielleicht kann mir einer von euch weiterhelfen :)

Ich versuche einen Code zu schreiben, der mithilfe einer Schleife die Ergebnisse einer SRU Suchanfrage nach und nach abruft, gesamt sind es etwa 200600. Ich kann nicht alle Ergebnisse auf einmal oder in großen Paketen abrufen, da der Server sonst überlastet ist und ausfällt. Bisher habe ich diesen Code:

Java:
package kalliope.abfrage;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Main {
  public static void main(String[] args) {
    try {
      // Suchanfrage definieren
    String searchQuery = "https://kalliope-verbund.info/sru?version=1.2&operation=searchRetrieve&query=ead.repository.isil=%22DE-2498%22+AND+ead.genre=%22Briefe%22+AND+ead.creator.gnd=%22118501232%22+OR+ead.addressee.gnd=%22118501232%22+OR+ead.creator.gnd=%22141293640%22+OR+ead.addressee.gnd=%22141293640%22+OR+ead.creator.gnd=%22118502751%22+OR+ead.addressee.gnd=%22118502751%22+OR+ead.creator.gnd=%22118502786%22+OR+ead.addressee.gnd=%22118502786%22+OR+ead.creator.gnd=%22116339780%22+OR+ead.addressee.gnd=%22116339780%22+OR+ead.creator.gnd=%22132054736%22+OR+ead.addressee.gnd=%22132054736%22+OR+ead.creator.gnd=%22118507931%22+OR+ead.addressee.gnd=%22118507931%22+OR+ead.creator.gnd=%22118508849%22+OR+ead.addressee.gnd=%22118508849%22+OR+ead.creator.gnd=%22118509683%22+OR+ead.addressee.gnd=%22118509683%22+OR+ead.creator.gnd=%22116158824%22+OR+ead.addressee.gnd=%22116158824%22+OR+ead.creator.gnd=%22118512676%22+OR+ead.addressee.gnd=%22118512676%22+OR+ead.creator.gnd=%22118661779%22+OR+ead.addressee.gnd=%22118661779%22+OR+ead.creator.gnd=%22118514865%22+OR+ead.addressee.gnd=%22118514865%22+OR+ead.creator.gnd=%2211851587X%22+OR+ead.addressee.gnd=%2211851587X%22+OR+ead.creator.gnd=%221033852155%22+OR+ead.addressee.gnd=%221033852155%22+OR+ead.creator.gnd=%22118525956%22+OR+ead.addressee.gnd=%22118525956%22+OR+ead.creator.gnd=%22118526634%22+OR+ead.addressee.gnd=%22118526634%22+OR+ead.creator.gnd=%22118826433%22+OR+ead.addressee.gnd=%22118826433%22+OR+ead.creator.gnd=%22118529374%22+OR+ead.addressee.gnd=%22118529374%22+OR+ead.creator.gnd=%221037763181%22OR+ead.addressee.gnd=%221037763181%22+OR+ead.creator.gnd=%22118098713%22+OR+ead.addressee.gnd=%22118098713%22+OR+ead.creator.gnd=%22103748102X%22+OR+ead.addressee.gnd=%22103748102X%22+OR+ead.creator.gnd=%22116771542%22+OR+ead.addressee.gnd=%22116771542%22+OR+ead.creator.gnd=%22118695045%22+OR+ead.addressee.gnd=%22118695045%22+OR+ead.creator.gnd=%22118695894%22+OR+ead.addressee.gnd=%22118695894%22+OR+ead.creator.gnd=%22119129388%22+OR+ead.addressee.gnd=%22119129388%22+OR+ead.creator.gnd=%22118541579%22+OR+ead.addressee.gnd=%22118541579%22+OR+ead.creator.gnd=%22118818058%22+OR+ead.addressee.gnd=%22118818058%22+OR+ead.creator.gnd=%22119138824%22+OR+ead.addressee.gnd=%22119138824%22+OR+ead.creator.gnd=%22118544675%22+OR+ead.addressee.gnd=%22118544675%22+OR+ead.creator.gnd=%22118701797%22+OR+ead.addressee.gnd=%22118701797%22+OR+ead.creator.gnd=%22118544551%22+OR+ead.addressee.gnd=%22118544551%22+OR+ead.creator.gnd=%22118709542%22+OR+ead.addressee.gnd=%22118709542%22+OR+ead.creator.gnd=%22116770058%22+OR+ead.addressee.gnd=%22116770058%22+OR+ead.creator.gnd=%2211855042X%22+OR+ead.addressee.gnd=%2211855042X%22+OR+ead.creator.gnd=%22118550578%22+OR+ead.addressee.gnd=%22118550578%22+OR+ead.creator.gnd=%22118551523%22+OR+ead.addressee.gnd=%22118551523%22+OR+ead.creator.gnd=%22119208768%22+OR+ead.addressee.gnd=%22119208768%22+OR+ead.creator.gnd=%22118706675%22+OR+ead.addressee.gnd=%22118706675%22+OR+ead.creator.gnd=%22116734507%22+OR+ead.addressee.gnd=%22116734507%22+OR+ead.creator.gnd=%2211855610X%22+OR+ead.addressee.gnd=%2211855610X%22+OR+ead.creator.gnd=%22118557327%22+OR+ead.addressee.gnd=%22118557327%22+OR+ead.creator.gnd=%22118558587%22+OR+ead.addressee.gnd=%22118558587%22+OR+ead.creator.gnd=%22120204614%22+OR+ead.addressee.gnd=%22120204614%22+OR+ead.creator.gnd=%22116011092%22+OR+ead.addressee.gnd=%22116011092%22+OR+ead.creator.gnd=%22118560395%22+OR+ead.addressee.gnd=%22118560395%22+OR+ead.creator.gnd=%22118559192%22+OR+ead.addressee.gnd=%22118559192%22+OR+ead.creator.gnd=%22118559206%22+OR+ead.addressee.gnd=%22118559206%22+OR+ead.creator.gnd=%22118560867%22+OR+ead.addressee.gnd=%22118560867%22+OR+ead.creator.gnd=%22116144998%22+OR+ead.addressee.gnd=%22116144998%22+OR+ead.creator.gnd=%22118561715%22+OR+ead.addressee.gnd=%22118561715%22+OR+ead.creator.gnd=%22118710087%22+OR+ead.addressee.gnd=%22118710087%22+OR+ead.creator.gnd=%22115641068%22+OR+ead.addressee.gnd=%22115641068%22+OR+ead.creator.gnd=%22122810937%22+OR+ead.addressee.gnd=%22122810937%22+OR+ead.creator.gnd=%22118564722%22+OR+ead.addressee.gnd=%22118564722%22+OR+ead.creator.gnd=%22118713698%22+OR+ead.addressee.gnd=%22118713698%22+OR+ead.creator.gnd=%22118565486%22+OR+ead.addressee.gnd=%22118565486%22+OR+ead.creator.gnd=%2211871595X%22+OR+ead.addressee.gnd=%2211871595X%22+OR+ead.creator.gnd=%22119023415%22+OR+ead.addressee.gnd=%22119023415%22+OR+ead.creator.gnd=%22112655491%22+OR+ead.addressee.gnd=%22112655491%22+OR+ead.creator.gnd=%22118569368%22+OR+ead.addressee.gnd=%22118569368%22+OR+ead.creator.gnd=%22118570951%22+OR+ead.addressee.gnd=%22118570951%22+OR+ead.creator.gnd=%22118571338%22+OR+ead.addressee.gnd=%22118571338%22+OR+ead.creator.gnd=%22118571990%22+OR+ead.addressee.gnd=%22118571990%22+OR+ead.creator.gnd=%22117041874%22+OR+ead.addressee.gnd=%22117041874%22+OR+ead.creator.gnd=%22120131080%22+OR+ead.addressee.gnd=%22120131080%22+OR+ead.creator.gnd=%2211857633X%22+OR+ead.addressee.gnd=%2211857633X%22+OR+ead.creator.gnd=%22118579266%22+OR+ead.addressee.gnd=%22118579266%22+OR+ead.creator.gnd=%22118783602%22+OR+ead.addressee.gnd=%22118783602%22+OR+ead.creator.gnd=%22122105397%22+OR+ead.addressee.gnd=%22122105397%22+OR+ead.creator.gnd=%22119128640%22+OR+ead.addressee.gnd=%22119128640%22+OR+ead.creator.gnd=%22118742337%22+OR+ead.addressee.gnd=%22118742337%22+OR+ead.creator.gnd=%22118641689%22+OR+ead.addressee.gnd=%22118641689%22+OR+ead.creator.gnd=%22118594524%22+OR+ead.addressee.gnd=%22118594524%22+OR+ead.creator.gnd=%22118787624%22+OR+ead.addressee.gnd=%22118787624%22+OR+ead.creator.gnd=%22118599194%22+OR+ead.addressee.gnd=%22118599194%22+OR+ead.creator.gnd=%22128593709%22+OR+ead.addressee.gnd=%22128593709%22+OR+ead.creator.gnd=%22118601172%22+OR+ead.addressee.gnd=%22118601172%22+OR+ead.creator.gnd=%22117231126%22+OR+ead.addressee.gnd=%22117231126%22+OR+ead.creator.gnd=%22117276413%22+OR+ead.addressee.gnd=%22117276413%22+OR+ead.creator.gnd=%22118608436%22+OR+ead.addressee.gnd=%22118608436%22+OR+ead.creator.gnd=%22107502763%22+OR+ead.addressee.gnd=%22107502763%22+OR+ead.creator.gnd=%22118616145%22+OR+ead.addressee.gnd=%22118616145%22+OR+ead.creator.gnd=%22118751980%22+OR+ead.addressee.gnd=%22118751980%22+OR+ead.creator.gnd=%22118798383%22+OR+ead.addressee.gnd=%22118798383%22+OR+ead.creator.gnd=%221144990866%22+OR+ead.addressee.gnd=%221144990866%22+OR+ead.creator.gnd=%22118619217%22+OR+ead.addressee.gnd=%22118619217%22+OR+ead.creator.gnd=%22118619322%22+OR+ead.addressee.gnd=%22118619322%22+OR+ead.creator.gnd=%22118619977%22+OR+ead.addressee.gnd=%22118619977%22+OR+ead.creator.gnd=%22118620959%22+OR+ead.addressee.gnd=%22118620959%22+OR+ead.creator.gnd=%22118840150%22+OR+ead.addressee.gnd=%22118840150%22+OR+ead.creator.gnd=%22118763520%22+OR+ead.addressee.gnd=%22118763520%22+OR+ead.creator.gnd=%22117468401%22+OR+ead.addressee.gnd=%22117468401%22+OR+ead.creator.gnd=%22118628186%22+OR+ead.addressee.gnd=%22118628186%22+OR+ead.creator.gnd=%22118806440%22+OR+ead.addressee.gnd=%22118806440%22+OR+ead.creator.gnd=%2211862993X%22+OR+ead.addressee.gnd=%2211862993X%22+OR+ead.creator.gnd=%22117297550%22+OR+ead.addressee.gnd=%22117297550%22+OR+ead.creator.gnd=%22118632361%22+OR+ead.addressee.gnd=%22118632361%22+OR+ead.creator.gnd=%22123609240%22+OR+ead.addressee.gnd=%22123609240%22+OR+ead.creator.gnd=%22118634666%22+OR+ead.addressee.gnd=%22118634666%22+OR+ead.creator.gnd=%22118637304%22+OR+ead.addressee.gnd=%22118637304%22+OR+ead.creator.gnd=%22138215928%22+OR+ead.addressee.gnd=%22138215928%22&maximumRecords=200600&recordSchema=dc";
    
 // Anzahl der gefundenen Treffer ermitteln
    int totalResults = 200600;

    // Dateinamen festlegen
    String fileName = "Kalliope_Abfrage.xml";
    
    // XML-Dokument auf dem Schreibtisch speichern
    String desktopPath = System.getProperty("user.home") + "/Desktop/";
    BufferedWriter writer = new BufferedWriter(new FileWriter(desktopPath + fileName));
    
    // In 50er-Schritten alle Treffer abrufen
    for (int startIndex = 1; startIndex <= totalResults; startIndex += 50) {
      // Anfrage an SRU senden und Ergebnis in XML-Dokument speichern
      URL url = new URL(searchQuery + "&startRecord=" + startIndex + "&maximumRecords=50");
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
      BufferedReader reader = new BufferedReader(inputStreamReader);
      String line;
      while ((line = reader.readLine()) != null) {
        writer.write(line);
      }
    }
    
    // Datei schließen
    writer.close();
  } catch (MalformedURLException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}
}

Eclipse meldet keine Fehler, aber wenn ich das Programm laufen lasse erhalte ich eine XML in der nur solche Ergebnisse aufgeführt sind <?xml version="1.0" encoding="utf-8"?>
Die SRU funktioniert, ist also korrekt, wenn auch mit Sicherheit unelegant. Kann mir jemand helfen, den Code so anzupassen, dass ich eine XML bekomme in der die Infos der SRU in Tabellenform stehen, damit ich damit in Open Refine arbeiten kann.

Es wäre toll, wenn jemand eine Lösung hat.

Liebe Grüße
 

KonradN

Super-Moderator
Mitarbeiter
Also da kann ich Dir nur raten: Bau es so, dass Du erst einzelne Ergebnisse holst und teste dies.

Wenn Du nur immer die Headerzeile hast, dann ist evtl. der Inhalt jeder Anfrage leer?
 

Hansen_07

Bekanntes Mitglied
Mal eine dumme Frage: was ist SRU?

Und im Titel steht was von Datenbankabfrage. Ich sehe aber nix Richtung SQL? Oder richtest du eine Frage an eine No-SQL DB? Ja, irgendwas mit XML kann man auch erkennen.

Mag ja vielleicht alles auch in deiner searchQuery zu erforschen sein, ist mir zur Weihnachtszeit aber einfach zu mühselig, das raus zu fummeln.
 
Mal eine dumme Frage: was ist SRU?

Und im Titel steht was von Datenbankabfrage. Ich sehe aber nix Richtung SQL? Oder richtest du eine Frage an eine No-SQL DB? Ja, irgendwas mit XML kann man auch erkennen.

Mag ja vielleicht alles auch in deiner searchQuery zu erforschen sein, ist mir zur Weihnachtszeit aber einfach zu mühselig, das raus zu fummeln.
Die SRU ist eine URL basierte Suche, damit kann ich zum Beispiel viele Bibliotheksdatenbanken durchsuchen.In meiner gebe ich an welche Datenbank ich durchsuchen will und welche Daten genau ich finden will. Ich kann dir leider nicht sagen, ob das was mit SQL zu tun hat/bzw. sich in meinem Fall äquivalent dazu verhält, da ich leider nicht weiß was das ist..
 

Oneixee5

Top Contributor
Wenn ich die oben gezeigte URL aufrufe, dann erhalte ich als Antwort:
XML:
<?xml version="1.0" encoding="utf-8"?>
Also liegt das Problem vermutlich bei der Abfrage.
 

Oneixee5

Top Contributor
SRU: https://www.dnb.de/DE/Professionell/Metadatendienste/Datenbezug/SRU/sru_node.html Die Seite in der URL ist ein Frontend, welches näher zu bestimmende Parameter zulässt (oder ablehnt) und vermutlich via passendes SQL (als Standard DB-Sprache) Daten abfragt und irgendwie ausgibt.
 
Wenn ich die oben gezeigte URL aufrufe, dann erhalte ich als Antwort:
XML:
<?xml version="1.0" encoding="utf-8"?>
Also liegt das Problem vermutlich bei der Abfrage.
Danke für den Tipp, ich werde mir die Abfrage nochmal anschauen! Aktuell könnte die Antwort aber auch daher kommen, dass der Server womöglich down ist, bei mir zumindest funktioniert nicht einmal die normale Suchfunktion ...
 

Hansen_07

Bekanntes Mitglied
Danke für den Tipp, ich werde mir die Abfrage nochmal anschauen! Aktuell könnte die Antwort aber auch daher kommen, dass der Server womöglich down ist, bei mir zumindest funktioniert nicht einmal die normale Suchfunktion ...

Ich habe aus Spaß mal die Beispielabfrage aus der Dokumentation zur SRU-Schnittstelle(unter praktische Beispiele) ausgeführt. Da wird ein XML-Dokument mit Inhalt zurückgegeben.

Vielleicht verwendest du diese Beispielabfrage mal in deinem Programm. Da siehst du dann zumindest, ob du überhaupt ein gültiges Ergebnis zurückerhältst.
So könntest du zumindest ausschließen, dass dein Programm nicht wie gewünscht funktioniert und vielleicht der Fehler in deiner eigentlichen Abfrage liegt.
 

KonradN

Super-Moderator
Mitarbeiter
Es wurde bisher auf die Abfrage geschaut, aber die Speicherung der Ergebnisse ist so natürlich ungültig.
a) Diese "Kopfzeile" darf nur einmal geschrieben werden (<?xml version="1.0" encoding="utf-8"?>)
b) Ein XML Dokument darf nur ein Root Element haben. Daher kann man die nicht einfach so aneinander hängen.

Also auch in dem Bereich ist noch weitere Arbeit notwendig!
 

M.L.

Top Contributor
Die Beispielabfrage aus der Doku funktioniert mit einer kleinen Modifikation im Java-Programm (Änderungen und Verfeinerungen aus diesem Thread aussen vor gelassen): Java_Kalliope_Abfrage.JPG
 

M.L.

Top Contributor
Unter Verstoss gegen die XML-Regeln und Verwendung des "Append"-Modus kann man die Ergebnisse der Abfragen -testweise- in eine (neue) XML-Datei schreiben:
Java:
...
for (int i=0; i<=3;i++) {
        String searchQuery="https://services.dnb.de/sru/dnb?version=1.1&operation=searchRetrieve&query=WVN%3D22A05&recordSchema=MARC21-xml";
...
BufferedWriter writer = new BufferedWriter(new FileWriter(desktopPath + fileName,true)); //",true" für append
...
writer.write(line);
          }
          writer.close();
        } // Ende for-Schleife
...

Ergebnis (z.B.) : 4 Treffer bei <?xml version="1.0" encoding="UTF-8"?> in der Zieldatei
 

KonradN

Super-Moderator
Mitarbeiter
Unter Verstoss gegen die XML-Regeln
Wobei es doch einfach wäre, da eben nicht gegen zu verstoßen.

Es würde ja schon ausreichen, das <?….?> am Anfang auszufiltern. Zur Not einfach die erste Zeile ignorieren wenn man es ganz einfach haben will.

Und dann schreibt man in die Datei halt erst diese Zeile (so man diese haben will, geht zur Not auch ohne) und dann ein beliebiges Tag also z.B. etwas wie <results>.

Wenn man dann durch ist, dann schreibt man vor dem Schließen der Datei noch das schließende Tag also bei dem Beispiel ein </results>.

Da gibt es also schon sehr einfache Lösungen daher sehe ich keine Notwendigkeit, dies zu ignorieren.
 

M.L.

Top Contributor
&maximumRecords=200600&recordSchema=dc";
Kleines Experiment: man verändert den Wert bei maximumRecords (testweise) auf 50 und erhält im Browser folgende Ausgaben (hat bei weiteren Änderungen nicht mehr funktioniert: Bad Request. ). Browserausgabe und txt-Ausgabe (Upload als .xml nicht möglich) im Anhang
 

Anhänge

  • FF_Kalliope_Abfrage_mit_50.png
    FF_Kalliope_Abfrage_mit_50.png
    412,3 KB · Aufrufe: 1
  • Kalliope_Abfrage_mit_50.txt
    38,2 KB · Aufrufe: 0
Update: Ich habe inzwischen eine Lösung gefunden. Ich habe den Code so beibehalten, wie er ursprünglich war und die SRU nur verkürzt, sodass keine 200600 Ergebnisse geladen werden müssen, sondern immer nur bis zu 30000. Das habe ich händisch gemacht. Code hat so letztlich funktioniert :)

Vielen Dank nochmal für eure Tipps und Hinweise, dank derer ich einiges lernen konnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N MySQL Datenbankabfrage oder Arraylist? Datenbankprogrammierung 2
J Datenbankabfrage / Teilmengen Datenbankprogrammierung 2
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
S MySQL Datenbankabfrage mit Eingabe aus Textfeld vergleichen Datenbankprogrammierung 4
C Modellierung Datenbankabfrage Datenbankprogrammierung 1
W SQL-Statement Datenbankabfrage über Yahoo Datenbankprogrammierung 0
B Fehlerhafte Datenbankabfrage Datenbankprogrammierung 3
H Oracle Datenbankabfrage ausgeben Datenbankprogrammierung 13
E MySQL Anzeige Datenbankabfrage in Textfeld o.ä. Datenbankprogrammierung 34
L Datenbankabfrage mit einer Range Datenbankprogrammierung 3
Y JDBC - Datenbankabfrage Webserver Datenbankprogrammierung 4
E H2 - Datenbankabfrage gibt NULL aus? Datenbankprogrammierung 4
H Einfache Datenbankabfrage Datenbankprogrammierung 14
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
F Problem mit Datenbankabfrage Datenbankprogrammierung 7
M Problem bei einfacher Datenbankabfrage Datenbankprogrammierung 7
W Problem mit Datenbankabfrage Datenbankprogrammierung 3
S Datenbankabfrage mit Applet Datenbankprogrammierung 13
A Datenbankabfrage mit KeyListener Datenbankprogrammierung 5
C Rückgabetyp einer Datenbankabfrage Datenbankprogrammierung 12
V Datenbankabfrage in einem Textfeld ausgeben Datenbankprogrammierung 3
L einfache Datenbankabfrage ohne erstes Element Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
R NUllPointerException bei Datenbankabfrage Datenbankprogrammierung 4
A SQL Datenbankabfrage in Array speichern Datenbankprogrammierung 3
P Datenbankabfrage MYSQL aus Applet heraus Datenbankprogrammierung 6
D Datenbankabfrage will nicht funktionieren Datenbankprogrammierung 5
C vergleichende Datenbankabfrage Datenbankprogrammierung 5
G datenbankabfrage Datenbankprogrammierung 4
A datenbankabfrage in sql mit java Datenbankprogrammierung 32
T Nochmal Datenbankabfrage Datenbankprogrammierung 6

Ähnliche Java Themen


Oben