Encoding Problem mit dem jdom SAXBuilder

aldi15

Grünschnabel
Hallo Cracks,
Ich habe ein Problem mit dem Einlesen von XML-Dateien mit SAXBuilder von jdom. Mein code sieht folgendermaßen aus:

SAXBuilder sxbuild = new SAXBuilder();
InputSource is;
is = new InputSource(m_MyUtils.GetWMCPath());
is.setEncoding("UTF-8");
Document doc = sxbuild.build(is);

Wenn ich mir das doc ausgeben lasse, sind die Sonderzeichen ausgetauscht worden gegen Hilfszeichen. Das verstehe ich nicht, da die codierung ja im xml-header klar als UTF-8 deklariert ist. Zur "Sicherheit" habe ich die Codierung nochmal im InputSource Ojekt gesetzt, aber dennoch ohne Erfolg. Kann mir jemand sagen, wie ich die Datei mit den Sonderzeichen eingelesen bekomme?

Grüße
Albrecht
 
Hallo Zerix,
die ganz normalen deutschern Umlaute sowie SZ, also nichts besonderes. Die Datei, die ich einlese sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>
<ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" id="atlas_world" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
<General>
...
</General>
<LayerList>
<Layer queryable="1" hidden="0">
<Server service="wms" version="1.1.1" title="wms">
<OnlineResource xlink:type="simple" xlink:href="http://webmap:8054/deegree2/ogcwebservice?" />
</Server>
<Name>atk3101_strassen</Name>
<Title>Straßen</Title>
<SRS>EPSG:31467</SRS>
<FormatList>
<Format current="1">image/gif</Format>
</FormatList>
<StyleList>
<Style current="1">
<Name>atk3101_strassen</Name>
<Title>atk3101_strassen</Title>
</Style>
</StyleList>
</Layer>
</LayerList>
</ViewContext>

und daraus wird nach dem Einlesen (s. Element "Title"):

<?xml version="1.0" encoding="UTF-8"?>
<ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" id="atlas_world" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
<General>
...
</General>
<LayerList>
<Layer queryable="1" hidden="0">
<Server service="wms" version="1.1.1" title="wms">
<OnlineResource xlink:type="simple" xlink:href="http://webmap:8054/deegree2/ogcwebservice?" />
</Server>
<Name>atk3101_strassen</Name>
<Title>Straßen</Title>
<SRS>EPSG:31467</SRS>
<FormatList>
<Format current="1">image/gif</Format>
</FormatList>
<StyleList>
<Style current="1">
<Name>atk3101_strassen</Name>
<Title>atk3101_strassen</Title>
</Style>
</StyleList>
</Layer>
</LayerList>
</ViewContext>

Ist mir schleierhaft, wieso. Kannst du damit was anfangen?
Grüße
Albrecht
 
Also vorab erstmal das Ergebnis: Es geht, was natürlich sehr gut ist!
Allerdings ist mir nicht ganz klar warum, was nicht so gut ist ;o)
Ich will nicht rechthaberisch wirken, aber eigentlich müsste mit UTF-8 alles an Zeichenkodierungen abgedeckt sein, was es überhaupt auf unserem Planeten gibt an Zeichen, denn UTF-8 kann laut Wikipedia 1.114.112 Unicode-Zeichen abbilden. Dazu gehören auch die nordeuropäischen Sonderzeichen wie deutsche Umlaute oder das nordische a mit Kringel drauf (u.s.w.). D.h. ISO-8859-1 (oder LATIN-1) ist eine Untermenge von UTF-8 (s. z.B. die Seite hier: http://www.columbia.edu/kermit/utf8.html mit ganz witzigen Beispielen). Soweit die Theorie; die Praxis sieht so aus:
Ich hatte zum testen alles auf ISO-8859-1 gesetzt (InputSource.setEncoding("ISO-8859-1"), den XML-header der einzulesenden Datei und den XMLOutputter - und siehe da es funktionierte. Um nun einzugrenzen, wer hier dieses encoding nicht versteht, habe ich alles wieder zurückgesetzt auf UTF-8 und nacheinander alle möglichen Stellen auf ISO gesetzt, bis die richtige Ausgabe kam. Hier der Code mit dem es geht:

Code:
---------
private boolean BindWMC() throws JDOMException, IOException{
boolean bSuccess=false;
Format format = Format.getPrettyFormat();
format.setEncoding("ISO-8859-1");

SAXBuilder sxbuild = new SAXBuilder();
InputSource is;
is = new InputSource(m_MyUtils.GetWMCPath());
is.setEncoding("UTF-8");
Document doc = sxbuild.build(is);
this.m_WMCdoc=doc;

//Ausgabe der XML zu Testzwecken:
XMLOutputter out = new XMLOutputter();
out.setFormat(format);
out.output( doc, System.out );

bSuccess=true;

return bSuccess;
}
---------

Auch der XML-header ist hier wieder UTF-8. Das heißt für mich, dass SAXBuilder- bzw. Document-intern das Dokument mit einem erweiterten (richtigen) Zeichensatz gehandelt wird und nur der XMLOutputter Probleme hat mit UTF-8, was mich allerdings auch wundern würde, denn in einer anderen Klasse lasse ich ein als UTF-8 kodiertes XML mit dem Outputter ausgeben, das durchaus Umlaute darstellen kann:

Code:
---------
private String GetRecordsRequest_PropIsLike(String SearchWord){
String cSearchClause="";
String GetRecordsRequest="";
Namespace ns = Namespace.getNamespace("http://www.opengis.net/cat/csw");
Namespace ns1 = Namespace.getNamespace("http://www.opengis.net/ogc");
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8");
XMLOutputter xmlOut = new XMLOutputter(format);

//GetRecords
Element root = new Element("GetRecords");
Document doc = new Document(root); //hier wird ein Dokument draus
root.setNamespace(ns);
root.setAttribute("version","2.0.0");

[...]

GetRecordsRequest=xmlOut.outputString(doc);
return GetRecordsRequest;
}

---------

Also muss der Fehler noch woanders liegen, oder wie siehst du das Zerix?
Wie auch immer - ich kann an dieser Stelle weitermachen. Vielen Dank für deine Hilfe.
Albrecht
 
Hallo,
ist deine Quelldatei vielleicht nicht UTF-8 kodiert, nur weil das dort so steht, muss das noch lange nicht so sein.
Würde ich auf jedenfall mal überprüfen.
Grüße Herbert
 
Zurück