Buch Metadaten aus XML Datei parsen

Hallo,
ich habe ein kleines Tool geschrieben welches eine ISBN an eine Datenbank sendet und erhalte dafür eine XML Datei mit allen Metadaten über das entsprechende Buch. Mit ein paar Datensätzen lief alles wunderbar. Jedoch ist mir aufgefallen, das manche Metadaten nicht wirklich korrekt sind.
Ich habe heraus gefunden, das ich manch mal mehr Informationen erhalte, als ich eigentlich wollte.
Bei Büchern bei denen alles stimmt, erhalte ich auch korrekt nur einmal die Daten über das Buch.
Bei Büchern mit Abweichungen der Metadaten habe ich festgestellt, das ich manchmal 2 bis dreifache Metadaten erhalte (Print, eBook, usw.)
Da ich mit SAX parse, bleiben dann die Daten des letzten Datensatzes gespeichert.
Da ich vorher nicht weiß wie viele Datensätze in der zurückgegebenen XML erhalte, ist es da überhaupt sinnvoll mit SAX zu parsen?
Danke
Mi
 
Dann gib mir mal einen Tipp, wie ich denn vorgehen sollte.
Mit XML habe ich nicht viel Erfahrung.
SAX arbeitet ja sequentiell ab und verarbeitet die die Daten sofort.
Was mir einfallen würde wäre ein zusätzliches Objekt zu erstellen das alle Daten der empfangenen XML aufnimmt.
Dieses könnte mann dann verarbeiten.
Aber macht das nicht DOM so?
 
Genau, mit einem DOM-Parser wird aus einem XML-Dokument ein vollständiges, an XML ausgerichtetes, fest definiertes Objektmodell erzeugt. Mit SAX erzeugst Du, was Du willst.

Während Du also bei DOM Objekte mit Document-/Element-/Node-Schnittstelle bekommst, aus denen Du ggf. Deine Domain-Objekte erzeugst, kannst Du mit SAX sofort die Domain-Objekte erstellen und zwar nur für die Ausschnitte der XML-Datei, die Du tatsächlich brauchst. Kurz: DOM ist im Handling (scheinbar) etwas einfacher, braucht dafür mehr Speicher.

Für eine konkrete Lösung fehlen noch ein paar Infos. Wie ist das XML strukturiert? Und wenn Du mehrere Metadaten für ein Buch erhältst, woher weißt Du, welche die richtigen sind?
 
Ja genau das ist der springende Punkt.
Wenn ich in einem XML mit mehreren Datensätze erhalte, weis ich nicht genau welches die richtigen sind.
Es kann der erste, der letzte oder der in der Mitte sein.
Wenn ich eine ISBN sende, erhalte ich ebenfalls ISBNs zurück. Es ist dann der richtige Datensatz, wenn die zurückgelieferte ISBN mit der gesendeten ISBN identisch ist.

Beispiel: Ich sende eine 13 Stellige ISBN 978-3-658-02836-0 (Buch)
und erhalte dann
978-3-658-02835-0 für Buch mit Metadaten
978-3-658-02836-7 für eBook mit weiteren Metadaten

Aktuell speichert mein Tool dann den letzten Datensatz wobei die Metadaten dann alle vom eBook entsprechen.
Ich könnte dann ja prüfen ob die ISBN stimmt und wenn ja, dann parse mit SAX ansonsten nicht, aber die iSBN kommt in der XML Datei nicht zu Anfang sondern erst später.

Ich weiss nicht wie speicherintensiv DOM ist, kenne nur SAX. Aber bei einem 16 bzw 32 GB Arbeitsspeicher sollten keine Probleme auftauchen wenn es sich um 2 bis 4 Datensätze in einer XML Datei handeln.

Warscheinlich sollte ich mich doch mal mit DOM beschäftigen und den Parser ggfs neu programmieren. Mit SAX habe ich Wochen gebraucht, bis der so lief wie er es jetzt macht. Leider hatte ich nicht damit gerechnet, das es auch mehrere Bücher in einer XML Datei zurück gegeben werden könnten. Das war bei meinen 5 Test ISBNs nicht der Fall.
 
Ich könnte dann ja prüfen ob die ISBN stimmt und wenn ja, dann parse mit SAX ansonsten nicht, aber die iSBN kommt in der XML Datei nicht zu Anfang sondern erst später.
Wie sieht denn das XML aus? Kannst Du mal ein Beispiel posten (in Code-Tags, also [code=XML]Inhalt der XML-Datei[/code])?

Aber bei einem 16 bzw 32 GB Arbeitsspeicher sollten keine Probleme auftauchen wenn es sich um 2 bis 4 Datensätze in einer XML Datei handeln.
LOL, bei 2 bis 4 Datensätze nicht wirklich (wobei es natürlich auf die Größe der Datensätze ankommt). Da würde ich keinen Gedanken an irgendwas verschwenden sondern den für mich einfachsten Weg nehmen.
 
Anbei eine Rückgabedatei mit nur einem Eintrag, die ich damals gespeichert hatte.
Am Anfang der XML steht schon die Angabe der Recordeinträge und wenn dort "1" für einen Eintrag steht, ist das unkompliziert da der Code dann wie gewünscht funktioniert.
Die Verwendung von SAX wäre mir am liebsten, da ich schon sehr viel Arbeit darin investiert habe und es schade darum wäre. Aufgrund von mangelndem Wissen in dieser Situation habe ich es dann leider lange vor mir her geschoben. Möchte das Problem aber jetzt endlich beheben.

Meine Aktuelle Situation sieht so aus, das ich mein Programmierprojekt auf das letzte und aktuellste prüfen muss, da ich durch einen Blitzeinschlag meinen iMac aus auch mein umfangreiches NAS Datensystem dabei verloren habe.
Zum Glück oder leider muss ich jetzt die vielen Netbeans Datensicherung durchgehen. :)

XML:
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
    <version>1.1</version>
    <numberOfRecords>1</numberOfRecords>
    <records>
        <record>
            <recordSchema>MARC21-xml</recordSchema>
            <recordPacking>xml</recordPacking>
            <recordData>
                <record xmlns="http://www.loc.gov/MARC21/slim" type="Bibliographic">
                    <leader>00000pam a2200000 c 4500</leader>
                    <controlfield tag="001">989219313</controlfield>
                    <controlfield tag="003">DE-101</controlfield>
                    <controlfield tag="005">20171202073101.0</controlfield>
                    <controlfield tag="007">tu</controlfield>
                    <controlfield tag="008">080617s2008 gw ||||| |||| 00||||ger </controlfield>
                    <datafield tag="015" ind1=" " ind2=" ">
                        <subfield code="a">08,A46,0093</subfield>
                        <subfield code="z">08,N27,0049</subfield>
                        <subfield code="2">dnb</subfield>
                    </datafield>
                    <datafield tag="016" ind1="7" ind2=" ">
                        <subfield code="2">DE-101</subfield>
                        <subfield code="a">989219313</subfield>
                    </datafield>
                    <datafield tag="020" ind1=" " ind2=" ">
                        <subfield code="a">9783834805690</subfield>
                        <subfield code="c">kart. : EUR 19.90</subfield>
                        <subfield code="9">978-3-8348-0569-0</subfield>
                    </datafield>
                    <datafield tag="024" ind1="3" ind2=" ">
                        <subfield code="a">9783834805690</subfield>
                    </datafield>
                    <datafield tag="035" ind1=" " ind2=" ">
                        <subfield code="a">(DE-599)DNB989219313</subfield>
                    </datafield>
                    <datafield tag="035" ind1=" " ind2=" ">
                        <subfield code="a">(OCoLC)723982056</subfield>
                    </datafield>
                    <datafield tag="040" ind1=" " ind2=" ">
                        <subfield code="a">1245</subfield>
                        <subfield code="b">ger</subfield>
                        <subfield code="c">DE-101</subfield>
                        <subfield code="d">9999</subfield>
                    </datafield>
                    <datafield tag="041" ind1=" " ind2=" ">
                        <subfield code="a">ger</subfield>
                    </datafield>
                    <datafield tag="044" ind1=" " ind2=" ">
                        <subfield code="c">XA-DE-HE</subfield>
                    </datafield>
                    <datafield tag="082" ind1="0" ind2="4">
                        <subfield code="8">1\u</subfield>
                        <subfield code="a">005.1</subfield>
                        <subfield code="q">DE-101</subfield>
                        <subfield code="2">22/ger</subfield>
                    </datafield>
                    <datafield tag="083" ind1="7" ind2=" ">
                        <subfield code="a">004</subfield>
                        <subfield code="q">DE-101</subfield>
                        <subfield code="2">22sdnb</subfield>
                    </datafield>
                    <datafield tag="085" ind1=" " ind2=" ">
                        <subfield code="8">1\u</subfield>
                        <subfield code="b">005.1</subfield>
                    </datafield>
                    <datafield tag="090" ind1=" " ind2=" ">
                        <subfield code="a">b</subfield>
                    </datafield>
                    <datafield tag="100" ind1="1" ind2=" ">
                        <subfield code="0">(DE-588)136269087</subfield>
                        <subfield code="0">http://d-nb.info/gnd/136269087</subfield>
                        <subfield code="0">(DE-101)136269087</subfield>
                        <subfield code="a">Rimscha, Markus von</subfield>
                        <subfield code="e">Verfasser</subfield>
                        <subfield code="4">aut</subfield>
                    </datafield>
                    <datafield tag="245" ind1="0" ind2="0">
                        <subfield code="a">Algorithmen kompakt und verständlich</subfield>
                        <subfield code="b">Lösungsstrategien am Computer</subfield>
                        <subfield code="c">Markus von Rimscha</subfield>
                    </datafield>
                    <datafield tag="250" ind1=" " ind2=" ">
                        <subfield code="a">1. Aufl.</subfield>
                    </datafield>
                    <datafield tag="259" ind1=" " ind2=" ">
                        <subfield code="a">11</subfield>
                    </datafield>
                    <datafield tag="264" ind1=" " ind2="1">
                        <subfield code="a">Wiesbaden</subfield>
                        <subfield code="b">Vieweg + Teubner</subfield>
                        <subfield code="c">2008</subfield>
                    </datafield>
                    <datafield tag="300" ind1=" " ind2=" ">
                        <subfield code="a">VIII, 144 S.</subfield>
                        <subfield code="b">Ill., graph. Darst.</subfield>
                        <subfield code="c">24 cm</subfield>
                    </datafield>
                    <datafield tag="336" ind1=" " ind2=" ">
                        <subfield code="a">Text</subfield>
                        <subfield code="b">txt</subfield>
                        <subfield code="2">rdacontent</subfield>
                    </datafield>
                    <datafield tag="337" ind1=" " ind2=" ">
                        <subfield code="a">ohne Hilfsmittel zu benutzen</subfield>
                        <subfield code="b">n</subfield>
                        <subfield code="2">rdamedia</subfield>
                    </datafield>
                    <datafield tag="338" ind1=" " ind2=" ">
                        <subfield code="a">Band</subfield>
                        <subfield code="b">nc</subfield>
                        <subfield code="2">rdacarrier</subfield>
                    </datafield>
                    <datafield tag="490" ind1="0" ind2=" ">
                        <subfield code="a">Studium</subfield>
                    </datafield>
                    <datafield tag="490" ind1="0" ind2=" ">
                        <subfield code="a">Online plus</subfield>
                    </datafield>
                    <datafield tag="500" ind1=" " ind2=" ">
                        <subfield code="a">Literaturverz. S. 137 - 141</subfield>
                    </datafield>
                    <datafield tag="650" ind1=" " ind2="7">
                        <subfield code="0">(DE-588)4001183-5</subfield>
                        <subfield code="0">http://d-nb.info/gnd/4001183-5</subfield>
                        <subfield code="0">(DE-101)040011836</subfield>
                        <subfield code="a">Algorithmus</subfield>
                        <subfield code="2">gnd</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Algorithmus</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Rekursiv</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Genetisch</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Heuristisch</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Problemlösungsstrategie</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Künstliche Intelligenz</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-FS)Künstlich</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-PF)BC: Paperback</subfield>
                    </datafield>
                    <datafield tag="653" ind1=" " ind2=" ">
                        <subfield code="a">(VLB-WN)1632: HC/Informatik, EDV/Informatik</subfield>
                    </datafield>
                    <datafield tag="689" ind1="0" ind2="0">
                        <subfield code="0">(DE-588)4001183-5</subfield>
                        <subfield code="0">http://d-nb.info/gnd/4001183-5</subfield>
                        <subfield code="0">(DE-101)040011836</subfield>
                        <subfield code="D">s</subfield>
                        <subfield code="a">Algorithmus</subfield>
                    </datafield>
                    <datafield tag="689" ind1="0" ind2=" ">
                        <subfield code="5">DE-101</subfield>
                        <subfield code="5">DE-101</subfield>
                    </datafield>
                    <datafield tag="850" ind1=" " ind2=" ">
                        <subfield code="a">DE-101a</subfield>
                        <subfield code="a">DE-101b</subfield>
                    </datafield>
                    <datafield tag="856" ind1="4" ind2="2">
                        <subfield code="m">B:DE-101</subfield>
                        <subfield code="q">application/pdf</subfield>
                        <subfield code="u">http://d-nb.info/989219313/04</subfield>
                        <subfield code="3">Inhaltsverzeichnis</subfield>
                    </datafield>
                    <datafield tag="925" ind1="r" ind2=" ">
                        <subfield code="a">ra</subfield>
                    </datafield>
                </record>
            </recordData>
            <recordPosition>1</recordPosition>
        </record>
    </records>
    <nextRecordPosition>2</nextRecordPosition>
    <echoedSearchRetrieveRequest>
        <version>1.1</version>
        <query>NUM=9783834805690</query>
        <xQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
        <recordSchema>MARC21-xml</recordSchema>
    </echoedSearchRetrieveRequest>
    <extraResponseData>
        <accountOf xmlns="">SRU</accountOf>
    </extraResponseData>
</searchRetrieveResponse>
 
Im Feld 020 a findet sich ja die ISBN. Ich weiß jetzt nicht, was Du wie ausliest, aber im Allgemeinen funktioniert es so, dass Du die Daten aus eines Element-Baums liest und in Objekten zwischenspeicherst. Beim Schließen des record-Elements brauchst Du ja nur zu prüfen, ob die ISBN passt. Dann weißt Du, ob der record der gesuchte ist.

Du kannst auch einfach einen ISBN-String deklarieren, den Du beim Öffnen eines record-Elements auf einen leeren String zurücksetzt. Dann merkst Du Dir in einem Flag, ob Du Dich gerade in einem datafield mit tag 020 befindest, bzw. in einem subfield mit code "a" des datafields mit tag 020. Dort setzt Du dann den ISBN-String. Beim schließen des record-Elements kannst Du dann auf Gleichheit mit der gesuchten ISBN prüfen.
 
Aufgrund der Schnittstellendokumentation der Deutschen Nationalbibliothek weiss ich welche Metadaten sich in den entsprechenden tags und codes befinden. Ich prüfe diese und schreibe die Inhalte dann in ein Java Objekt (buchObjekt).
Wenn die ISBN zum vergleich ansteht, sind bereits Zeilen verarbeitet, geprüft und gespeichert worden.
Meinst du das wenn die ISBN nicht übereinstimmt, dass dann alle bereits gelesen und gespeicherte Metadaten verworfen werden sollen und alle weiteren ignorieren bis der neue Metadaten Record anfängt?

Das würde auch bedeuten wenn beim ersten Record die ISBN stimmt und alle Daten gespeichert wurden müssen alle nachträglichen Records ignoriert werden.
 
Danke für deine Hilfe,
ich werde das Projekt suchen, zurückspeichern und dann versuchen es zu implementieren.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben