# SAX Parsing - Umlaute/Sonderzeichen



## critti (26. März 2008)

Hallo zusammen,

Ich habe ein Problem mit Umlauten bzw. Sonderzeichen während des SAX Parsings.
Die Umlaute/Sonderzeichen werden vom Parser nicht korrekt erkannt.
Hier meine XML Datei

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE PRAS SYSTEM ".\example.dtd">
<Test>
    <Head>
        <Name>tutorials.de</Name>
        <ErstellungsDatum>2008-02-02</ErstellungsDatum>
        <Ansprechperson>öäü Müller</Ansprechperson>
    </Head>
<Test>
```
wen man das File mit dem Notepad oder einem anderen Editoren öffnet sieht man das die Sonderzeichen als Unicode stehen . &#246 228 &#252 .

Beim Parsen mit dem SAXParser 
	
	
	



```
XMLReader parser = XMLReaderFactory.createXMLReader();
```
sollten alle Zeichen von ContentHandler erkannt werden.


```
public void characters(char[] ch, int start, int length) throws SAXException {
        String str = new String(ch, start, length);
        System.out.println("Zeichenkette: " + str);
    }
```
Ausgabe:


```
Zeichenkette: tutorials.de
Zeichenkette: 2008-02-02
Zeichenkette: ö
Zeichenkette: ä
Zeichenkette: ü 
Zeichenkette: M
Zeichenkette: ü
Zeichenkette: ller
```
Wie kann man das verhindern das die Zeichen einzeln ausgegeben werden? 
Schliesslich will ich jeweils den Inhalt des Ganzen Tags und keine Bruchstücke.

Habe mich hier im Forum auch schon umgeschaut jemand hatte ein ähnliches Problem:http://www.tutorials.de/forum/java/268764-sax-parsing-umlaute-sonderzeichen.html

Dies half mir leider nicht weiter. Ich habe nun einen Weg gefunden die Umlaute korrekt einzulesen bzw. das XML-File mit UTF-8 gleich abzuspeichern, jedoch ersetze ich <,>,/ ,\ innerhalb der Tags durch Unicode... damit das XML-Well Formed bleibt und auch geparst werden kann und dort ist dieses Problem noch immer vorhanden, so das es jeden Unicode einzeln ausgibt. 

Gruß Marco


----------



## Thomas Darimont (27. März 2008)

Hallo,

versuchs mal mit Dom4J:

```
/**
 * 
 */
package de.tutorials;

import java.io.File;

import org.dom4j.Document;
import org.dom4j.io.SAXReader;

/**
 * @author Thomas.Darimont
 * 
 */
public class SAXParserExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
          SAXReader reader = new SAXReader();
        reader.setStripWhitespaceText(true);
        reader.setMergeAdjacentText(true);
        Document document = reader.read(new File("test.xml"));
        System.out.println(document.getRootElement().getStringValue());

    }

}
```


```
<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <Head>
        <Name>tutorials.de</Name>
        <ErstellungsDatum>2008-02-02</ErstellungsDatum>
        <Ansprechperson>öäü Müller</Ansprechperson>
    </Head>
</Test>
```

Ausgabe:

```
tutorials.de2008-02-02öäü Müller
```

Gruß Tom


----------



## critti (27. März 2008)

Hmm.. das Problem liegt daran das meine Aufgabe mit SAX gelöst werden soll.. und die ganze Applikation schon so konstruieret wurde.

 So erstelle ich den Parser:

```
is = new InputSource(uri);
			ch = new cHandler();
			eh = new eHandler();
			dh = new dHandler();
			log.info("Parser wurde erstellt!");
			try {
				XMLReader parser = XMLReaderFactory.createXMLReader();
				parser.setContentHandler(ch);
				parser.setErrorHandler(eh);
				parser.setDTDHandler(dh);
				parser.setEntityResolver(er);
				log.info("ContetHandler wurde zugewiessen");
				log.info(is.getSystemId() + "' wir geparst...");
				parser.parse(is);
				log.info("Der ParseVorgang ist beendet");
			}

			catch (Exception e) {
				System.err.println("Error selecting..");
				Throwable t = e;
				while (t != null) {
					System.err.print(this.getClass().getSimpleName());
					System.err.println(" Type: " + t.getClass().getName());
					System.err.println("Message: " + t.getMessage());
					System.err.println("----");
					t = t.getCause();
				}}
```


und das durch denn cHandler (implements ContentHandler) in der funktion characters(...):


```
public void characters(char[] ch, int start, int length) throws SAXException {
        String str = new String(ch, start, length);
        System.out.println("Zeichenkette: " + str);
    }
	}
```

 werden normalerweise schön alle Inhalte einzeln ausgegeben bzw. ein String pro Tag Inhalt
statt des SystemOut habe ich dann eine Methode der ich den ganzen Inhalt sende und verarbeite. Es treten daher Fehler auf wen ein String aufgeteilt und die Methode mehrmals aufgerufen wird wegen den Sonderzeichen.


Kann man das nicht mit dem Sax Parser lösen? 


Gruss Marco


----------

