XMLStreamWriter verarbeitet keine line separator

Hi,

wie der Titel schon sagt scheint der XMLStreamWriter keine line separator zu verarbeiten.
Ganz großes Problem, sitze bereits seit einigen Tagen daran eine klitzekleine XML-Datei zu schreiben.
Das Problem ist aber eben das der Wert von einigen Attributen newline character enthält, die dann aber nicht in XML geparsed werden sondern einfach direkt in die Datei geschrieben werden.

Weiß jemand wie ich dieses Problem umgehen kann?

<inhalt wert="Zeile1
Zeile2"</inhalt>

statt

<inhalt wert="Zeile1
Zeile2"</inhalt>

Ich habe versucht das Problem zu umgehen indem ich direkt "
" in den Stream geschrieben habe, aber dann kodiert er das “&” in “&” und es kommt das hier heraus

<inhalt wert="Zeile1&#13;&#10;Zeile2"</inhalt>

Die Sache ist die, XML Dateien sind ja wirklich nicht schwer zu schreiben (lesen ist viel eher das Problem und das funktioniert tadellos), wenn ich nur irgendwie einen Parser hätte der mir eben so Spezialcharacter wie "
" und “”" und “&” in XML character formatiert (&#xy) dann würde ich das einfach mal schnell selber hinpfeffern, aber über diesen XML Schwachsinn findet man leider nicht soviel wie ich es gerne hätte und dann bleibe ich bei so einer banalen Aufgabe für mehrere Tage hängen.

Achja selbstverständlich habe ich auch versucht den unterliegenden Stream auszutauschen indem ich den FileWriter überschreibe, dann kann ich eben genau dieses Konstrukt " " abfangen und richtig hinschreiben (schmutzig aber geht), das Problem dann ist aber wieder das ich auf eine Codierung (utf-8 / iso-wasweißich-1) verzichten muss und dann kommt wieder Mist bei raus weil die XML datei unter anderem chinesisch und russisch enthält und weitere tolle special-character-sprachen und dann sieht die datei nurnoch so aus “???”.

Bitte sagt mir ich habe irgendwas übersehen!?

Das einzige was ich mir noch denken könnte wäre setProperty(), jedoch gibt es keine Dokumentation was man dort einstellen kann.
Ich habe den Code zurückverfolgt (war nicht leicht) und herausgefunden dass drunterliegende Klasse von der FactoryMethode aber nur factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); verwendet…
bin am verzweifeln.

Jede Hilfe ist willkommen
Beste Grüße
TMII

Schonmal über CDATA nachgedacht?

[quote=TMII]XML Dateien sind ja wirklich nicht schwer zu schreiben (lesen ist viel eher das Problem und das funktioniert tadellos), wenn ich nur irgendwie einen Parser hätte der mir eben so Spezialcharacter wie "
" und “”" und “&” in XML character formatiert (&#xy) dann würde ich das einfach mal schnell selber hinpfeffern[/quote]
ist speziell diese Spezialcharacter-Umwandlung so schwer?
ich selber habe eine kleine Methode, Zeilenumbruch nicht dabei, aber das willst du ja vielleicht auch gar nicht ersetzen (nicht wirklich verstanden nach langen Posting), sonst noch zu ergänzen
[spoiler]

        for (char c : text.toCharArray())
        {
            case '<':
                    b.append("&l t;"); // edit: Leerzeichen darin damit das Forum sie nicht umwandelt, 
                           // nochmal edit: wobei Fehler nicht zu reproduzieren..
                    break;
                case '>':
                    b.append("&g t;");
                    break;
                case '&':
                    b.append("&am p;");
                    break;
                case '"':
                    b.append("&qu ot;");
                    break;
                case '\'':
                    b.append("&ap os;");
                    break;
                default:
                    b.append(c);
                    break;
            }
        }

[/spoiler]
für weitere Sonderzeichen Fehlermeldung abwarten oder mal alle Zeichen einzeln duch richtiges XML schicken oder Listen,
nach List of XML and HTML character entity references - Wikipedia, the free encyclopedia nur meine 5


[quote=TMII;112452]indem ich den FileWriter überschreibe, dann kann ich eben genau dieses Konstrukt "
" abfangen und richtig hinschreiben (schmutzig aber geht), das Problem dann ist aber wieder das ich auf eine Codierung (utf-8 / iso-wasweißich-1) verzichten muss[/quote]
überschreiben mag schmutzig sein, aber wieso Codierungsproblem, wenn du sonst FileWriter verwendest, dann doch auch schon Codierungsfrage?
oder verwendest du sonst createXMLStreamWriter(OutputStream stream)? kannst ja mal im Quellcode suchen wie da weiter Encoding festgelegt wird,

sonst für sich daran arbeiten, ein FileWriter ohne weitere Angaben verwendet Default-Encoding, auf Windows nicht unbedingt begrüßenswert,
auf UTF-8 zu wechseln ist aber nicht so schwer, siehe etwa hier, Code mal nicht in der Antwort mit grünem Häkchen sondern darunter (mehrere)
How to write a UTF-8 file with Java? - Stack Overflow

Warum sollte das Schwachsinn sein? Tatsächlich - etwas überraschend - ist die Behandlung von Whitespace DAS THEMA in XML schlechthin, war es schon bei der Spezifikation vom XML.

White Space in XML Documents

What You Need to Know About Whitespace in XML

XML Whitespace

https://msdn.microsoft.com/en-us/library/ms256097(v=vs.110).aspx

Understanding xml:space

usw. usf.

http://www.w3.org/TR/REC-xml/#sec-white-space

Zu deiner Frage:

Du willst etwas, das die XML Spec gar nicht erlaubt - wird also schwierig für dich.

Mach mal ein System.out.println mit der Instanz des XMLStreamWriter. Damit kriegst Du die tatsächliche Klasse raus, die das Ding hat. Mit dem Klassennamen kannst Du dann suchen, welche Properties unterstützt werden. Ggf. diesen hier mal posten.

Nachgedacht ja, da die XML aber zum Datenprotokollaustausch dient mit einem anderen Server weiß ich nicht was auf der anderen Seite mit dem CDATA passiert. Ist CDATA XML standard? Also wenn CDATA verwendet wird dann definitiv HTML?

Danke, wie gesagt enthält die XML viele unterschiedliche Sprache. Dein Beispiel deckt damit leider nur diese paar Zeichen ab, aber alle russischen Buchstaben werden dann nicht interpretiert.
Das Problem ist wenn ich die Codierung außerhalb verändere hat das keinen Einfluss auf den XMLStreamWriter, das erste was passiert ist das er eine Exception wirft mit “Codierung stimmt nicht mit in XML angegebener Codierung überein”, und die Codierung kann man leider nur mit einem FileOutputStream zusammen festlegen, nicht mit dem FileWriter Konstruktor.

Aber du hast schon recht, vielleicht sollte ich das Ergebnis des Outputstreams mal versuchen irgendwo anderst hineinzustreamen um dann im post-processing Styl den den Newline zu überschreiben, würde aber bedeuten die ganze Codierung würde wieder verloren gehen. Ach ach ist das kompliziert ^^

Okay danke, dass das ganze nicht erlaubt ist hatte ich in der Spezifikation nicht gesehen.
Schon witzig denn die SteamAPI möchte genau das…
Und mit Schwachsinn meine ich nicht XML selbst (wobei aufgebläht ist es schon), sondern eben diesen whitespace Mist. Wie ich höre gibt es bei anderen APIs eine whitespace flag.

Schon gemacht und schon gefunden
GC: XMLStreamWriterImpl - com.sun.xml.internal.stream.writers.XMLStreamWriterImpl (.java) - GrepCode Class Source
Die einzige Property die er verwendet ist
“isRepairingNamespace”

wobei mir beim überfliegen aufgefallen ist, das er anscheinend UTF-8 standardmäßig verwendet, das kann ich in der Praxis nicht bestätigen, all den Fragezeichen zu urteilen aber muss mir das nochmal anschauen.