# XML in UTF-8 mit SAX parsen



## Rated_R (12. Nov 2010)

Hallo!
Ich habe ein Problem mit meinem SAX-Parser:
Und zwar hole ich mir von einem RESTful Webservice eine XML-Datei mit UTF-8 Encoding (habe also keinen Einfluss auf das gelieferte Ergebniss). Diese Datei enthält Sonderzeichen, z.B:
[XML]<opening_hours>Öffnungszeiten: Mo-Sa. 09:00- 01:00  &amp; So. 09:00-18:00 Uhr</opening_hours>[/XML]
Statt dem Ö steht aber "& #214" (ohne Leerzeichen da sonst wieder "Ö" zu sehen wäre).

Die XML-Datei wird zuerst als String angespeichert, um diesen dann an den Parser zu senden.
Dabei lautet der Parseraufruf wie folgt:

```
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); //xml ist der XML-String
InputSource isource = new InputSource();
isource.setByteStream(is);
isource.setEncoding("UTF-8");
reader.parse(isource);
```
Nun tritt folgendes Problem auf: Das Parsen an sich funktioniert ohne Exceptions, nur sieht der geparste String aus obigem Beispiel dann so aus:
"ffnungszeiten: Mo-Sa. 09:00- 01:00 Uhr So. 09:00- 18:00 Uhr"

Bei Sonderzeichen wie ä, ü, ö und ß wird also nur der String nach dem Sonderzeichen geparst und der Rest ignoriert.
Steht zum Beispiel in der XML-Datei
[XML]<street>Hauptstraße</street>[/XML]
("& #223" statt "ß") bleibt am Ende nur "e" übrig.

Ich habe mir natürlich meinen eigenen Content-Handler geschrieben und ich vermute dass der Fehler in der characters-Methode liegt. Aber ich habe keine Idee wie ich ihn beheben könnte.

```
public void characters(char[] ch, int start, int length) throws SAXException {
	tempVal = new String(ch,start,length);
}
```
tempVal wird dann je nach endElement in meiner Klasse abgespeichert, z.B:

```
public void endElement(String uri, String localName,
	          String qName)
	          throws SAXException {
if(qName.equalsIgnoreCase("street")){
	tmpAd.setStreet(tempVal);
}
```

Ich wäre sehr froh wenn mir jemand weiterhelfen könnte.
Danke im Voraus!


----------



## Marcinek (12. Nov 2010)

Das sind XML entities  und müssten decodiert werden.

Das hat aber nix mit dem encoding UTF / ISO zu tun


----------



## Rated_R (12. Nov 2010)

danke für die Antwort!
Sorry wenn ich das verwechselt habe...wie kann ich also diese Zeichen so umwandeln dass mein SAX-Parser das auch richtig interpretiert?


----------



## Marcinek (12. Nov 2010)

Er sollte sie schon richtig interpretieren könnne.

Wenn du sie ersetzen willst, dann kannst du mal eine SimpleEntitieResover an deinem Parser registrieren.


----------



## Wildcard (12. Nov 2010)

Übrigens ist mir nicht ganz klar warum du einen String in ein byte[] wandelst nur um daraus wieder einen String zu machen. Nimm doch zB einen StringReader


----------



## Marcinek (12. Nov 2010)

```
public void characters(char[] ch, int start, int length) throws SAXException {
    tempVal = new String(ch,start,length);
}
```

Meinst du das?

Das ist eine SAX Calllback Methode


----------



## Rated_R (12. Nov 2010)

Danke habs geschafft!
Habe mit diesen beiden Zeilen die HTML Entities in Ö, ß usw umgewandelt:

```
result = StringUtils.unescapeHTML(result);
result = StringEscapeUtils.unescapeXml(result);
```
und dann mit

```
result = result.replaceAll("&", "amp");
```
das & in den Links ersetzen da sonst folgender error kam:

*The reference to entity "in" must end with the ';' delimiter*.

Vielleicht nicht besonders schön gelöst, aber es macht den Job *g*


----------



## Wildcard (12. Nov 2010)

Marcinek hat gesagt.:


> ```
> public void characters(char[] ch, int start, int length) throws SAXException {
> tempVal = new String(ch,start,length);
> }
> ...


Nein, ich meine das:

```
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); //xml ist der XML-String
```


----------



## Rated_R (12. Nov 2010)

aja das mit dem sinnlosen herumwandeln von String-->Byte-->String habe ich übersehen, danke!


----------



## Bierhumpen (14. Nov 2010)

Das ist jetzt der ungefähr dreihundertste Thread zu dem Problem, weil anscheinend niemand für nötig hält die Dokumentation zu lesen, in der nämlich steht, dass die characters() Methode auch mehrmals aufgerufen werden kann. Deine Implementierung überschreibt jedes mal den vorherigen Wert. Da musst du auch keine Entitäten umwandeln, auch wenn's funktioniert, ansonsten haut er's dir halt in einer Woche um die Ohren mit ner anderen XML Datei.


----------

