Handling XML escape characters (e.g. quotes) using JAXB Marshaller

前端 未结 5 738
無奈伤痛
無奈伤痛 2020-12-01 21:47

I need to serialize an XML java object to a XML file using the JAXB Marshaller (JAXB version 2.2). Now in the xml object, I have a tag which contains String value

5条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-01 22:27

    With JAXB marshaller if you want full control over which characters to escape(e.g. "\'") you will have to add property :

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CustomCharacterEscapeHandler());
    

    and create a new CustomCharacterEscapeHandler class

    import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
    
    import java.io.IOException;
    import java.io.Writer;
    
    public class CustomCharacterEscapeHandler implements CharacterEscapeHandler {
    
        public CustomCharacterEscapeHandler() {
            super();
        }
    
        public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
            // avoid calling the Writerwrite method too much by assuming
            // that the escaping occurs rarely.
            // profiling revealed that this is faster than the naive code.
            int limit = start+length;
            for (int i = start; i < limit; i++) {
                char c = ch[i];
                if(c == '&' || c == '<' || c == '>' || c == '\'' || (c == '\"' && isAttVal) ) {
                    if(i!=start)
                        out.write(ch,start,i-start);
                    start = i+1;
                    switch (ch[i]) {
                        case '&':
                            out.write("&");
                            break;
                        case '<':
                            out.write("<");
                            break;
                        case '>':
                            out.write(">");
                            break;
                        case '\"':
                            out.write(""");
                            break;
                        case '\'':
                            out.write("'");
                            break;
                    }
                }
            }
    
            if( start!=limit )
                out.write(ch,start,limit-start);
        }
    }
    

    Hope that helps.

提交回复
热议问题