# CData verwenden oder Sonderzeichen escapen?



## TheSunToucher (7. Jun 2005)

Hallo,

ich exportiere den Inhalt einer Tabelle nach XML und hatte bisher "ISO-8859-1" verwendet und keine Probleme mit deutschen Sonderzeichen und umlauten. Da wir jetzt auch polnische Zeichen in der Datenbank speichern (und demnächst weitere Sprachen hinzukommen), habe ich das encoding auf "UTF-8" geändert. Jetzt gibt der SAX-Parser Exceptions wenn er einen Umlaut im XML findet.

Ich könnte die Umlaute wie beispielsweise ein "Ü" durch "Ü" ersetzen, nur Leider müßte ich das dann für alle Sonderzeichen tun, also auch die polnischen, das "$" das "§" usw. Also habe ich ein wenig gesucht und "<![CData[" gefunden, aus dem ich nicht so richtig schlau werde. Sollte ich das CData einfach grundsätzlich verwenden? Und ist das überhaupt das richtige oder hab ich da was falsch verstanden? Und verhält sich der SAX-Parser weiter wie bisher wenn ich das XML wieder einlese?

Danke, gruß
Tim


----------



## TheSunToucher (7. Jun 2005)

Aha! Ich habe mich geirrt, CDATA löst das Problem nicht. Folgendes beispiel gibt in meiner SAXParser-Testklasse immernoch eine Exception:


```
<?xml version='1.0' encoding='UTF-8'?>
<dsf><![CDATA[TESTö]]></dsf>
```

Also muss ich doch alle Zeichen escape'n? Ich hab nach einer Utility-Klasse gesucht die das kann, hab leider nix gefunden. Wenn einer was kennt wäre ich sehr dankbar.

BTW:
Beim suchen bin ich über die Klasse "StringEscapeUtils" aus dem Apache Commons Projekt gestolpert. Diese löst das Problem zwar nicht, aber ich hätte sie schon öfter mal brauchen können, deshalb will ich euch den Link nicht vorenthalten.

jakarta.apache.org/commons/lang/api/org/apache/commons/lang/StringEscapeUtils.html


----------



## Bleiglanz (8. Jun 2005)

du gehst da wohl etwas in die falsche Richtung

=> CDATA ist dafür da, dass man < > & nicht ständig escapen muss, d.h. für "ungeparsten" Inhalt

hat überhaupt nix mit dem Character-Encoding zu tun!

die Frage ist eher, woher die ÄÖÜs stammen, und wie das XML zusammengebaut wird; es reicht auf keinen Fall, dass du einfach im Prolog encoding="UTF-8" schreibst: die Datei selbst muss dann natürlich auch wirklich UTF-8 kodiert sein...


----------



## TheSunToucher (9. Jun 2005)

Das CDATA kann nicht mehr als das? komisch...

Ich hab das jetzt so gemacht, das ich alles außer A-Z, a-z, 0-9 und Leerzeichen escape. Dabei benutze ich immer den ASCii-Code also z.B. "Ü". Scheint ganz gut zu funktionieren, werde es mal mit den angesprochenen ausländischen Sonderzeichen testen. Meine Methode sieht wie folgt aus:


```
private String escapeXml(String str) {
        
        StringBuffer sb = new StringBuffer();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int ascii = chars[i];
            if( !(ascii >= 48 && ascii <= 57)  && 	// 0-9
                !(ascii >= 65 && ascii <= 90)  && 	// A-Z
                !(ascii >= 97 && ascii <= 122) &&	// a-z
                !(ascii == 32) ){					// space	
                
                sb.append("&#" + ascii + ";");
            }else{
                sb.append(chars[i]);
            }
        }
        str = sb.toString();
        
        return str;
    }
```


----------



## Bleiglanz (10. Jun 2005)

ein StringBuffer ist eben nicht so wirklich gut geeignet um xml zu erzeugen

schau dir mal die Klasse XML Filter an, damit kannst du einfach eine XML erzeugen und das ganze quoten/escapen wird dir abgenommen

ansonsten würde ich SEHR aufpassen, java Strings haben keine Ahnung vom ASCII-Code, das ganze passt nur für codes <= 127; aber wenns funzt ists auch ok...


----------



## TheSunToucher (10. Jun 2005)

Die Methode die ich gepostet habe ist ursprünglich aus der Klasse "XmlWriter" aus einem Apache Projekt und sah ursprünglich so aus:


```
private String escapeXml(String str) {
        
        if(str == null) {
            return null;
        }
        
        str = replace(str, "&", "&");
        str = replace(str, "<", "&");
        str = replace(str, ">", "&");
        str = replace(str, "\"", "&");
        str = replace(str, "'", "&");
        
        return str;
    }
```

Ich wollte weiterhin die Klasse XmlWriter nutzen, da hab ich die Methode geändert. Wo finde ich den die "XMLFilter" Klasse, ist die aus JAXP?


----------

