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
 
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?
 
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..
 
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.
 
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 ...
 
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.
 
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!
 
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
 
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
 
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.
 
&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

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.
 

Zurück
Oben