6

我正在使用 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>

<?xml version="1.0" ?><metadata xmlns:ext="http://musicbrainz.org/ns/ext#-2.0" xmlns="http://musicbrainz.org/ns/mmd-2.0#" created="2013-02-27T11:39:15.394Z"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"></track-list></cdstub></cdstub-list></metadata>

即已<track-list count="5"/>成为<track-list count="5"></track-list>不可取的,我不确定它为什么这样做。

4

3 回答 3

5

这显然是一个常见问题 - 并标记为错误JAXB 生成非法 XML 字符

您可以在转义非法字符中找到解决方法

于 2012-11-05T11:01:11.763 回答
2

另一种解决方案是使用 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));

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

于 2014-08-05T21:30:11.643 回答
0

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

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

在这个例子中,replaceALL 方法用下划线替换不可打印的字符。因此,您的 msgContent 将只是可打印的字符,并且可以防止 JAXB 使用非法字符。

于 2016-01-27T12:12:10.807 回答