Sonderzeichen bei XML Serialisierung nicht konvertieren

freggeln

Mitglied
Hallo,

mittels JAXBContext serialisiere ich Objekte nach XML. Hierbei habe ich das Problem, dass eine »<« in »&lt;« konvertiert wird.

Gibt es eine Möglichkeit dies zu verhindern und nach der Serialisierung wirklich die »<« in der XML Datei zu haben?

Danke & Gruß
 
Du musst lediglich ein CDDATA einfügen .. dann sollte es klappen
CDATA - Wikipedia, the free encyclopedia
Beispiel:
[XML]<deinTag><![CDATA[ ich bin < als du ]]></deinTag>[/XML]

Gruß Jörg

Genau das habe ich gemacht und genau von diesem CDATA Teil wird eben »<« in »&lt;« beim Serialisieren gewandelt, obwohl die Datei sogar schon als UTF8 schreibe.

Gruß

EDIT:

Ich habe mal ein ein einfaches Beispiel für mein Problem erstellt.

Java:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.*;

public class DemoSeria {
	public static void main( String[] args ) throws Exception {
		MyObject vMyObject = new MyObject();
		JAXBContext ctx = JAXBContext.newInstance(MyObject.class);
        Marshaller m = ctx.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		File vFile = new File("DemoSeria.xml");
		FileOutputStream vStream = new FileOutputStream( vFile );
		BufferedWriter vWriter = new BufferedWriter( WriterUTF8.getWriterUTF8( vStream ) );		
		m.marshal(vMyObject, vWriter);
        vWriter.flush();
		vWriter.close();
	}	
}

Java:
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
class MyObject {
		String MyString = "<![CDATA[ ich bin < als du ]]>";
		
		public String getMyString() {
			return this.MyString;
		}
		
		public void setMyString( String vString ) {
			this.MyString = vString;
		}
	}

Und als Datei kommt dann das folgende Ergebnis:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myObject>
    <myString>&lt;![CDATA[ ich bin &lt; als du ]]&gt;</myString>
</myObject>
 
Zuletzt bearbeitet:
Dann probiers mal damit... hatte an die andere Richtung gedacht 😀
Java:
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class DemoSeria {

    public static void main(String[] args) throws Exception {
        Object vMyObject = new MyObject();
        Marshaller m =JAXBContext.newInstance( MyObject.class ).createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        File vFile = new File("DemoSeria.xml");
        FileOutputStream vStream = new FileOutputStream(vFile);
        //BufferedWriter vWriter = new BufferedWriter(  vStream );
        m.setProperty("com.sun.xml.internal.bind.characterEscapeHandler", new CharacterEscapeHandler() {

            @Override
            public void escape(char[] ac, int i, int j, boolean flag, Writer writer) throws IOException {
                // do not escape
                writer.write(ac, i, j);
            }
        });
        m.marshal( vMyObject, new OutputStreamWriter( vStream ) );
        //m.marshal(vMyObject, vStream);
        //vWriter.flush();
        //vWriter.close();
    }

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    static class MyObject {

        @XmlJavaTypeAdapter(value = Adapter.class)
        String MyString = "ich bin < als du";

        private static class Adapter extends XmlAdapter<String, String> {

            @Override
            public String marshal(String v) throws Exception {
                return "<![CDATA[" + v + "]]>";
            }

            @Override
            public String unmarshal(String v) throws Exception {
                return v;
            }
        }
    }
}

gruß Jörg
 
Vielen Dank für die Antwort. Würde ich gerne probieren, aber ich kann ein Paket nicht einbinden.

Java:
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;

Kannst Du mir sagen, wo ich das passende Paket bekomme? Aus einer Suche bei Google bin ich leider nicht wirklich schlau geworden.

Danke & Gruß
 
was für eine Java Version nutzt du ? Ich hab nix eingebunden ..
JDK1.6...
Gruß

Also soweit ich weiß habe ich das auch. ???:L Gerade mal zur Sicherheit geprüft

Code:
javac -version
javac 1.6.0_22

java -version
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03, mixed mode)

Sieht für mich auch stark nach JDK1.6 aus, oder?

Gruß
 
Google sagt das wäre nen Bug, Sun sagt das wäre so gewollt .. wie dem auch sei, mit dem Zusatz
Code:
javac -XDignore.symbol.file=true
sollte es funktionieren..

Bug 6778491
 

Zurück
Oben