使用JAXB Marshaller处理XML转义字符(例如引号)

jav*_*dev 8 java escaping character jaxb marshalling

我需要使用JAXB Marshaller(JAXB 2.2版)将XML java对象序列化为XML文件.现在在xml对象中,我有一个包含String值的标记,这样:

"<"tagA>
**"<"YYYYY>done"<"/YYYYY>**
"<"/tagA>
Run Code Online (Sandbox Code Playgroud)

现在您可以看到此字符串值再次包含标记.我希望在xml文件中以相同的方式编写它.

但是JAXB Marshaller会转换这些值,例如:

"&"lt;YYYYY"&"gt;"&"#xD;done ......等等

我无法使用JAXB 2.2单独处理这些转义字符.反正可能吗?

在这方面的任何帮助都会很棒..

在此先感谢Abhinav Mishra

jav*_*dev 9

通过为JAXB Marshaller设置以下属性来完成它:

marshaller.setProperty("jaxb.encoding", "Unicode");
Run Code Online (Sandbox Code Playgroud)


小智 8

有一种更简单的方法.首先使用自定义转义序列:

m.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
    @Override
    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
        out.write( ch, start, length ); 
    }
}); 
Run Code Online (Sandbox Code Playgroud)

然后将其编组为如下所述的字符串

StringWriter writer = new StringWriter();
m.marshal(marshalObject, writer);
Run Code Online (Sandbox Code Playgroud)

然后从下面提到的编写器创建一个文档对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource( new StringReader( writer.toString() ) );
Document doc = builder.parse( is );
Run Code Online (Sandbox Code Playgroud)

转义字符问题将得到解决

  • 这种方法的问题是您无法使用OpenJDK构建应用程序.com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler是Sun JDK的缩写. (5认同)