ampersand zerstückelt das parse Ergebnis

MiMa

Top Contributor
Hallo,
ich pase mit SAX meine zurückgegebne XML Informationen im UTF-8 Format.
Leider habe ich hin und wieder in Abschnitte Infromationen mit Ampsersand (&amp.
HTML:
datafield tag="856" ind1="4" ind2="2">
    <subfield code="m">X:MVB</subfield>
    <subfield code="q">text/html</subfield>
    <subfield code="u">http://deposit.d-nb.de/cgi-bin/dokserv?id=3369118&prov=M&dok_var=1&dok_ext=htm</subfield>
    <subfield code="3">Inhaltstext</subfield>
</datafield>


Von SAX erhalte ich zu diesem einen Datensatz gleich 3 zerstückelte informationen.
INFO marc21CoHandler Link : http://deposit.d-nb.de/cgi-bin/dokserv?id=3369118
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : &
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : prov=M
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : &
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : dok_var=1
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : &
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
INFO marc21CoHandler Link : dok_ext=htm
INFO marc21CoHandler Tag : 856
INFO marc21CoHandler Code : u
Da SAX ereignisbasierend arbeitet, habe ich nicht die gesamte Datei im speicher ind kann nicht komplett darüber schauen. Weis vielleicht jemand, wie man das problem lösen könnte.
Danke
 

MiMa

Top Contributor
Guten Morgen,
das XML bekomme ich als Antwort von der Deutschen Nationalbibiothek direkt in den Parser.
Java:
// Zusammenstellung des Abfrage-Strings für die DNB Datenbank
String sruAbfrage = "https://services.dnb.de/sru/dnb?version=1.1&.....
....
// Das Parsen wird gestartet
xmlReader.parse(sruAbfrage);
...
Wenn ich vorher daran noch etws ändern muss, dann bestimmt mit einer zwischenspeicherung und anschliessenden Manipulation?
 

AndyJ

Bekanntes Mitglied
Das ist natuerlich ein Problem. Ich wuerde den Anbieter erstmal darauf hinweisen, dass das Dokument nicht valide ist. Bis das gefixt wird musst du dir aber erstmal selber helfen. Erstmal ist dein XML ja nur ein xbeliebiger String, du koenntest also alle & mit der entsprechenden Escapesequenz ersetzen. Ist halt etwas Programmierarbeit - testen ob's innerhalb oder ausserhalb einer CDATA Sequenz ist oder ob der & schon escaped ist oder nicht, etc..
 

stg

Top Contributor
Wenn ich vorher daran noch etws ändern muss, dann bestimmt mit einer zwischenspeicherung und anschliessenden Manipulation?

Mag sein, dass es auch anders geht, aber ich mach das in solchen Fällen auch so, dass ich die Antwort zunächst als einfachen String einlese und dann entweder nachbearbeite und in den Parser schicke, oder aber direkt "von Hand" parse. Je nachdem, was im konkreten Fall weniger aufwändig ist.
 

MiMa

Top Contributor
Ich habe die XML mal direkt über den Browser abgerufen.
Hier ein Teilauschnitt mit dem Problembereich

Angezeigt im Browser
<datafield tag="856" ind1="4" ind2="2">
<subfield code="m">X:MVB</subfield>
<subfield code="q">text/html</subfield>
<subfield code="u">http://deposit.d-nb.de/cgi-bin/dokserv?id=3369118&prov=M&dok_var=1&dok_ext=htm</subfield>
<subfield code="3">Inhaltstext</subfield>
</datafield>

Der Quelltext aus dem Browser
Code:
<datafield tag="856" ind1="4" ind2="2">
      <subfield code="m">X:MVB</subfield>
      <subfield code="q">text/html</subfield>
      <subfield code="u">http://deposit.d-nb.de/cgi-bin/dokserv?id=3369118&amp;prov=M&amp;dok_var=1&amp;dok_ext=htm</subfield>
      <subfield code="3">Inhaltstext</subfield>
    </datafield>

XML und parsen ist für mich noch ziemlich neu.
Wie müsste der Datensatz 856u denn aussehen, damit diese Valide ist?
Gibt es Java Befehle um vorher zu prüfen ob eine XML valide ist oder nicht?

Danke
 
Zuletzt bearbeitet:

MiMa

Top Contributor
Das ist die Methode, mit dem ich dass XML abfrage
Java:
public class DNBmarc21 {

    // Erstellt ein LoggerObjekt und holt dessen Instanz
    private static Logger log = Logger.getLogger(DNBmarc21.class);

    // Parsen der ISBN über das Marc21 XML Format der DNB
    public static Buch parseISBN(Buch buchObjekt)
            throws ParserConfigurationException, SAXException, IOException {
        // Zusammenstellung des Abfrage-Strings für die DNB Datenbank
        String sruAbfrage = "h t t p s : / / ..............";

        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        saxFactory.setNamespaceAware(true);
        SAXParser saxParser = saxFactory.newSAXParser();
        XMLReader xmlReader = saxParser.getXMLReader();

        DNBmarc21CoHandler handler = new DNBmarc21CoHandler(buchObjekt);
        xmlReader.setContentHandler(new DNBmarc21CoHandler(buchObjekt));

        // Das Parsen wird gestartet
        xmlReader.parse(sruAbfrage);

        // Gibt das Parser Objekt zurück
        return handler.parserBuchObjekt;
    } // parseISBN

In dem Post oben sieht man den Quellcode nicht wirklich so richtig, das der "&amp;" da drin ist.
Das sehe ich im Browser, wenn ich mit den Quellcode anzeigen lasse. Habe mal ein paar leerzeichen eingefügt, damit man es sehen kann.
<subfield code="u">h t t p : / / deposit.d-nb.de/cgi-bin/dokserv?id=369118 &amp; prov=M &amp; dok_var=1 &amp; dok_ext=htm</subfield>
 

MiMa

Top Contributor
Das problem mit der Zerstückelung habe ich immer noch nicht lösen können.
Jetzt tritt das Problem auch ich woanders auf :(
Code:
<datafield tag="264" ind1=" " ind2="1">
      <subfield code="a">München</subfield>
      <subfield code="a">Boston &#152;[u.a.]&#156;</subfield>
      <subfield code="b">Addison-Wesley</subfield>
      <subfield code="c">2002</subfield>
    </datafield>
Im Seitenquelltext wird dieser bereich ebenfalls wieder rot dargestellt.
Ich weis nicht wie ich damit umgehen soll?
 

Harry Kane

Top Contributor
Jetzt tritt das Problem auch ich woanders auf
Wo denn genau? Wenn ich den text in den notepad++ kopiere, und die XML Syntaz checken lasse, wird das "ü" bei "München" bemängelt. Das liess sich aber durch umstellen des encodings von ansi auf UTF8 beheben.
Würde das gleiche Problem mit dem Stax parser auch bestehen?
Vermutlich. Ich kann mir nicht vorstellen, das ein Dokument was durch einen Parser als fehlerhaft bemängelt wird, durch einen anderen Parser ohne Gemecker bearbeitet wird. Ist aber letzlich von der Implementierung des Parsers abhängig. Es gibt nicht "den StaX Parser".
 

MiMa

Top Contributor
In der zurückgegebenen XML tauchen immer mehr Teilbereiche auf, in denen ampserand enthalten sind.
Im Netz habe ich informationen gefunden, das man solche Probleme mit einem String Buffer beseitigen kann. In der SAX Methode Characters soll man mit einem String Buffer arbeiten. Aber leider bin ich mir noch nicht ganz im klaren, wie das funktionieren soll? Werden da die einzelnen Zeiche untersucht und dann in einen Buffer geschrieben?
 

MiMa

Top Contributor
Hi,
ich weiss es ist schon etwas her und habe das Problem noch nicht gelöst. Der Grund dafür ist wieder ein weiteres Problem welches aufgetaucht ist.
Warscheinlich ist das sequentielle abarbeiten mit SAX wohl doch nicht so günstig. Ich habe mit der aktuellen Version um die 300 Datensätze prüfen lassen. Mir ist aufgefallen das mein Programm teilweise falsche Werte enthält. Den Grund habe ich dann letzenedes Gefunden und der lag bei der XML Rückgabe von der Bibliothek. Es kommt vor, das ich zu einer Abfrage eines Buch nicht wie erwartet einen Datensatz in der XML zurück bekomme, sondern zwei oder mehr. Der erste ist das erwartete Buch und der zweite ist dann eine Online Ausgabe oder ähnliches. Die ISBN stimmen dann auch nicht mehr überein. Da sequetiel geprüft und abgearbeitet wird, erhalte ich immer den letzten Eintrag und die vorangegangenen werden einfach überschrieben.
Wäre es jetzt besser statt SAX mit DOM zu arbeiten, oder gibt es da eine andere Möglichkeit?
Mit DOM hat man ja ein Modell welches man mit Abfragen dann die richtigen Daten heraussucht und dabei könnte man die Stellen mit den Ampersandfehlern direkt bereinigen. DOM habe ich aber bisher noich nicht kennen gelernt. Ich bin jetzt etwas unschlüssig, wie ich am schlauesten wieter Verfahren soll?
 

Harry Kane

Top Contributor
Wenn du mal Code posten würdest, in dem deine Auswertlogik drinsteht, könnte man dir helfen.
Der einzige Code, den du bisher gepostet hast, ist die main von DNBmarc21. Die Auswertelogik steckt aber nicht in der main, sondern in den Methoden von DNBmarc21CoHandler, die durch das ContentHandler interface vorgegeben sind. Es wäre mal interessant, die zu sehen.
Mit den vorliegenden Informationen halte ich eine zielgerichtete Diskussion für nicht durchführbar.
 

krgewb

Top Contributor
Ich habe die XML mal direkt über den Browser abgerufen.
Hier ein Teilauschnitt mit dem Problembereich

Angezeigt im Browser


Der Quelltext aus dem Browser
Code:
<datafield tag="856" ind1="4" ind2="2">
      <subfield code="m">X:MVB</subfield>
      <subfield code="q">text/html</subfield>
      <subfield code="u">http://deposit.d-nb.de/cgi-bin/dokserv?id=3369118&amp;prov=M&amp;dok_var=1&amp;dok_ext=htm</subfield>
      <subfield code="3">Inhaltstext</subfield>
    </datafield>

XML und parsen ist für mich noch ziemlich neu.
Wie müsste der Datensatz 856u denn aussehen, damit diese Valide ist?
Gibt es Java Befehle um vorher zu prüfen ob eine XML valide ist oder nicht?

Danke

Die Datei rechtsklicken -> Öffnen mit -> Firefox
Ich habe das gemacht (siehe Screenshot).
 

Anhänge

  • xxx.png
    xxx.png
    11,2 KB · Aufrufe: 110

Ähnliche Java Themen

Neue Themen


Oben