XML mit Umlauten einlesen

Hallo zusammen,

in meiner Anwendung habe ich eine Textarea die von einem anderen Programm gefüllt wird. Diesen String forme ich mir zu einem Document um damit ich dann diesen String als XML verarbeiten kann.

Enthält der String keine Sonderzeichen oder Umlaute ist alles in ordnung und ich kann das XML verarbeiten. Nun kann es aber vorkommen, dass dort Umlaute enthalten sind und dann möchte ich aber trotzdem noch mein XML verarbeiten können.

Ich habe jetzt schon die Kodierung bei getBytes() angegeben als “ISO-8859-1” und “ISO8859_1” mit dem gleichen Ergebniss als hätte ich nichts, angegeben.

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public final class XMLService{

    public xmlLesen(String eingabe){
        InputStream in = new ByteArrayInputStream(eingabe.getBytes("ISO-8859-1"));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;            
        builder = factory.newDocumentBuilder();
->>     Document doc = builder.parse(in);
        doc.getDocumentElement().normalize();
        // Verarbeitung des XMLs
    }
}

Stacktrace:

	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:372)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(XMLEntityScanner.java:1074)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:948)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(XMLDocumentFragmentScannerImpl.java:1507)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1280)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2717)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
	at meineApp.util.XMLService.xmlLesen(XMLService.java:99)```

Hab ich irgendwas vergessen, oder gibt es andere Möglichkeiten?

Hatte schon überlegt, den String vorm Umformen in einen Inputstream durch zugehen und alle Umlaute und sonderzeichen zu ersetzen, aber das ist bestimmt nicht zu effizient und auf fehleranfällig, wenn ich irgendein Zeichen vergessen sollte.

Ich denke das ist weniger ein Problem des Streams als ein Problem des Parsers. Es sollte helfen das passende Encoding im Header der xml anzugeben.

Das Problem an der ganzen Sache ist aber, das es ja keine echte XML-Datei ist.

Der XML-String sieht etwa so aus.
[XML]

... ... [/XML]

Leider kann ich daran vor dem Eintragen in das Textfeld nichts dran ändern. Notfalls muß ich doch den String bearbeiten bevor ich mir den Inputstream erstelle.

was ist eigentlich ‘eingabe’? wie wird dieser String erzeugt, von Datei? wie eingelesen, sieht Ausgabe des Strings ok aus?

auf anderem Wege als in Encoding-Angabe der Datei ist dem DocumentBuilder auch noch nicht mitgeteilt worden, was er denn nun zu erwarten hat,
geht vielleicht standardmäßig von UTF8 aus

wenn DocumentBuilder UTF8 will, passt dann nicht eher eingabe.getBytes("UTF8 ")?

public class Test
{
    public static void main(String[] args) throws Exception
    {
        String eingabe ="äbc";
        InputStream in = new ByteArrayInputStream(eingabe.getBytes("UTF8"));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(in);
        doc.getDocumentElement().normalize();

    }
}

wirft schonmal eine andere Fehlermeldung als zuvor, das kann gut oder schlecht sein

edit:

       Document doc = builder.parse(new InputSource(new StringReader(eingabe)));

bzw. einen sonstigen Reader auf eine Datei der selber das Encoding übernimmt,

bei einem Stream ist immer die Frage, nach welchen Encoding daraus Zeichen werden,
ein Reader ist damit fertig, liefert Zeichen

verwende doch einfach utf-8

        InputStream in = new ByteArrayInputStream(eingabe.getBytes("UTF-8"));

bei einem Bytestrom macht das der Parser wahrscheinlich automatisch

Danke @Bleiglanz , das war es. Manchmal ist die Lösung echt zu einfach xD

btw: bei mir reicht schon das hier:
[xml]<?xml version="1.0" encoding="utf-8"?>[/xml] in die erste Zeile zu schreiben. Wenn du die Java Methoden verwendest, dann passt das schon (also StAX, SAX, DOM).