Java 当数据包含不可显示的字符时,JAXB输出无效的XML

Java 当数据包含不可显示的字符时,JAXB输出无效的XML,java,xml,jaxb,eclipselink,moxy,Java,Xml,Jaxb,Eclipselink,Moxy,我使用JAXB 2.2.5从JAXB模型输出Xml,数据从数据库填充,有时数据库包含不应显示的字符,例如 0x1a 如果它这样做了,那么JAXB只需按原样输出这个字符就可以输出无效的Xml,它不应该转义它吗 更新 我想知道是否有任何实现可以解决这个问题,也许Eclipselink MOXy可以 编辑 我尝试了解决非法字符问题的方法,但是它以一种不希望的方式改变了输出 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>&l

我使用JAXB 2.2.5从JAXB模型输出Xml,数据从数据库填充,有时数据库包含不应显示的字符,例如

0x1a 
如果它这样做了,那么JAXB只需按原样输出这个字符就可以输出无效的Xml,它不应该转义它吗

更新

我想知道是否有任何实现可以解决这个问题,也许Eclipselink MOXy可以

编辑

我尝试了解决非法字符问题的方法,但是它以一种不希望的方式改变了输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><metadata created="2013-02-27T11:40:04.009Z" xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"/></cdstub></cdstub-list></metadata>
弗雷德 到

弗雷德
i、 e
已经变成了不受欢迎的
,我不知道它为什么这样做。

这显然是一个常见的问题,并被标记为bug


您可以在

找到解决方法另一种解决方案是使用Apache Commons Lang删除无效的XML字符:

import org.apache.commons.lang3.StringEscapeUtils;

String xml = "<root>content with some invalid characters...</root>";
xml = StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(xml));
import org.apache.commons.lang3.StringEscapeUtils;
String xml=“包含一些无效字符的内容…”;
xml=StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(xml));

escapeXml10
方法将对字符串进行转义并删除无效字符。
unescapeXml
方法将撤消转义。最终结果是相同的XML,但删除了无效的XML字符。

只需将字符替换为消息内容中的任意或空格即可。如果您不想使用额外的jar或第三方产品,可以尝试以下方法:

String msgContent = "......";// string with some illegal character
msgContent = msgContent .replaceALL("\\P{Print}","_");

在本例中,replaceALL方法将不可打印的字符替换为下划线。因此,您的msgContent将只是可打印的字符,从而防止JAXB使用非法字符。

这是可行的,但不幸的是,它以另一种我不希望的方式更改了输出,请参阅问题更新谢谢您的回答。不幸的是,您链接到的解决方案有一些缺陷,比如没有缩进生成的XML:(我想更新的链接也是相关的)
String msgContent = "......";// string with some illegal character
msgContent = msgContent .replaceALL("\\P{Print}","_");