# jdom XML-Encoding auslesen



## phoenix180783 (6. Jul 2010)

Hallo Leute,

ich hoffe, dass ich nicht einfach blind bin und es deswegen hier her gehört und nicht ins basic Forum.

Folgender Programmablauf:

Ich habe eine XML, die ich per JDOM auslese und dann das Rootelement habe, dass funktioniert auch alles super

Dann manipuliere ich daran rum und schreibe wieder die XML, funktioniert auch, dass einzige, was mich stört, dass ich das Encoding vom Schreiben im Code vorgebe. Ich möchte es aber eigentlich so realisieren. Encoding vom Eingangsxml in einer Variable und dann wieder nutzen.
Problem: Ich finde nicht, wo das Encoding steht.
Ich baue mir ein Document mit dem Saxbuilder(Filepath) und aus dem Document bekomme ich das Rootelement, nur habe ich nirgends das Encoding gefunden.

Langer Post zum Erklären und kurze Frage: Wie bekomme ich mit jdom das Encoding einer xml raus ?

Dankeschön


----------



## Niki (6. Jul 2010)

Ich hab jetzt mal nach deinem Problem gegoogelt, leider mit wenig Erfolg. Anscheinend gibt es über JDOM keine Möglichkeit an das Encoding ran zu kommen. Du müsstest das daher selber ermitteln


----------



## phoenix180783 (6. Jul 2010)

Hallo Niki,

danke für deine Antwort.

Kannst du mir einen Hinweis geben, wie ich das mache, ohne eine zusätzliche Lib einzubinden?
Da ich alles mit Jdom mache, würde ich ungern jetzt noch etwas anderes einbinden.


----------



## Noctarius (6. Jul 2010)

Datei als Reintext einlesen und die erste Zeile holen, dann den Inhalt dieser Zeile selber auf das Encoding überprüfen. Allerdings gibt es auch XML Files ohne den Encoding-Header.


----------



## Niki (6. Jul 2010)

nur mal quick'n dirty runtergeschrieben:

```
public static String findEncoding(File f)throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(f));
        String s = br.readLine();
        Pattern p = Pattern.compile("encoding=\".*\"");
        Matcher m = p.matcher(s);
        String encoding = null;
        if(m.find()){
            String sub = s.substring(m.start(), m.end());
            encoding = sub.substring(sub.indexOf("\"")+1, sub.lastIndexOf("\""));            
        }
        br.close();
        return encoding;
    }
```


----------



## Noctarius (6. Jul 2010)

Als Regex nutz das hier "encoding=\"(.*?)\"" und dann als Group Nummer 1


```
public static String findEncoding(File f)throws IOException {
        try {
            BufferedReader br = new BufferedReader(new FileReader(f));
            String s = br.readLine();
            Pattern p = Pattern.compile("encoding=\"(.*?)\"");
            Matcher m = p.matcher(s);
            String encoding = null;
            if(m.find()){
                return m.group(1).toUpperCase();
            }

            return "UTF-8";
        } finally {
            br.close();
        }
    }
```


----------



## Niki (6. Jul 2010)

so ists natürlich noch schöner 
kleiner fehler ist noch drin:

```
return m.group(1);
```


----------



## Noctarius (6. Jul 2010)

Geändert  Das kommt wenn man sich das aus anderer Leutz Code zusammen kopiert *g*

PS: Code auch mal kompilierbar gemacht


----------



## phoenix180783 (7. Jul 2010)

Vielen Dank Leute, ich werde die Idee dem Reintextparsen nutzen, die Lösung ist natürlich auch schön, dass mit dem Default, falls nix vorhanden ist, habe ich mir auch so vorgestellt


----------



## Noctarius (7. Jul 2010)

Keine Ursache


----------



## phoenix180783 (7. Jul 2010)

Ich habe den Code noch etwas an mein System angepasst und da vielleicht jemand Interesse hat, poste ich Ihn nochmal hier. Mir geht es darum, dass ich ausserhalb kein Exceptionhandling jedesmal möchte


```
public static String FindEncoding(String xmlFilePath) {
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(xmlFilePath));
			Matcher encodingFinder = Pattern.compile("encoding=\"(.*?)\"").matcher(reader.readLine());
			if (encodingFinder.find()) {
				return encodingFinder.group(1).toUpperCase();
			}
		} catch (IOException ioex) {
			ConsoleOutput.WriteErrorToConsole("Error during usage of the Filestream!", ioex, true);
		}
		finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException ioex) {
					ConsoleOutput.WriteErrorToConsole("Error during closing of the Filestream!", ioex, true);
				}
			}
		}
		return "UTF-8";
	}
```


----------



## Gast2 (7. Jul 2010)

Nur so nebenbei: Wurdest du schon mal drauf hingewiesen das man in Java normalerweise Methodennamen mit Kleinbuchstaben beginnt?


----------



## phoenix180783 (8. Jul 2010)

Jap, aber ich habe meine Gründe:
1. Ich programmiere C# und Java -> benutze einheitlich camel casing
2. So weiß ich, welche Funktionen in einer Lib oder einen Hauptprogramm von mir sind und nicht von Extern

Und um ehrlich zu sein, es gibt Vorteile von beiden Frameworks .net und java, aber kleine Methodennamen suggerieren mir immer was Richtung lokale Variablen 
Jeder hat seine Vorlieben


----------

