# ampersand zerstückelt das parse Ergebnis



## MiMa (1. Okt 2016)

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.

```
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  : &
> ...


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


----------



## AndyJ (4. Okt 2016)

Das Format deines XML Dokuments ist nicht valid.

Du kannst einen CDATA section delimiter verwenden, um deine Daten reinzuschreiben:

<![CDATA[
Text hier, auch mit Sonderzeichen wie &, <, >, etc..
]]>

Oder du ersetzt das & mit einem Escape-string:
'&' --> '&#038;'

https://www.w3.org/TR/2000/REC-xml-20001006#syntax


----------



## MiMa (4. Okt 2016)

Guten Morgen,
das XML bekomme ich als Antwort von der Deutschen Nationalbibiothek direkt in den Parser.

```
// 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 (4. Okt 2016)

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 (4. Okt 2016)

MiMa hat gesagt.:


> 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 (4. Okt 2016)

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>
> ...



Der Quelltext aus dem 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&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


----------



## stg (4. Okt 2016)

das XML sieht für mich laut deinem letzten Post doch valide aus.

Zeig doch mal deinen Code, mit dem du den Krams einliest.

Bzw schau dir doch direkt mal das hier an: http://stackoverflow.com/questions/13336140/sax-parsing-and-special-characters


----------



## MiMa (4. Okt 2016)

Das ist die Methode, mit dem ich dass XML abfrage

```
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 (9. Okt 2016)

Das problem mit der Zerstückelung habe ich immer noch nicht lösen können.
Jetzt tritt das Problem auch  ich woanders auf 

```
<datafield tag="264" ind1=" " ind2="1">
      <subfield code="a">Mü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?


----------



## MiMa (12. Okt 2016)

Würde das gleiche Problem mit dem Stax parser auch bestehen?


----------



## Harry Kane (14. Okt 2016)

MiMa hat gesagt.:


> 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.


MiMa hat gesagt.:


> 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 (15. Okt 2016)

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?


----------



## Harry Kane (16. Okt 2016)

Wenn du die Quelle angeben kannst wo du die Infos her hast, könnte ich mir das mal durchlesen und dir ev. näher erklären.


----------



## MiMa (28. Mrz 2017)

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 (31. Mrz 2017)

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 (31. Mrz 2017)

MiMa hat gesagt.:


> Ich habe die XML mal direkt über den Browser abgerufen.
> Hier ein Teilauschnitt mit dem Problembereich
> 
> Angezeigt im Browser
> ...



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


----------

