XML in UTF-8 mit SAX parsen

Rated_R

Mitglied
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:
Java:
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.
Java:
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:
Java:
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!
 
Das sind XML entities und müssten decodiert werden.

Das hat aber nix mit dem encoding UTF / ISO zu tun
 
Zuletzt bearbeitet von einem Moderator:
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?
 
Er sollte sie schon richtig interpretieren könnne.

Wenn du sie ersetzen willst, dann kannst du mal eine SimpleEntitieResover an deinem Parser registrieren.
 
Ü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
 
Java:
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
 
Danke habs geschafft!
Habe mit diesen beiden Zeilen die HTML Entities in Ö, ß usw umgewandelt:
Java:
result = StringUtils.unescapeHTML(result);
result = StringEscapeUtils.unescapeXml(result);
und dann mit
Java:
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*
 
Java:
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
Nein, ich meine das:
Java:
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); //xml ist der XML-String
 
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.
 

Zurück
Oben