You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 1.8环境下JAXB Unmarshalling如何忽略XML中未转义的&符号

JAXB反序列化XML时处理未转义&符号的可行方案

你原本设想的全局替换&为&再反向替换的方案存在不可靠风险:如果XML中本身存在已合法转义的实体(如&、<、>等),全局替换会导致二次转义,最终反序列化结果会出现不符合预期的字符。同时反向替换步骤是多余的,JAXB反序列化时会自动将XML中的&解析为&,无需额外操作。

以下是经过验证的可行方案:

方案1:精准替换message标签内的特殊字符

仅对<message>和</message>标签包裹的内容做转义处理,不会影响XML其他部分的合法结构,是适配你当前场景成本最低的方案,可靠性极高。
Java代码示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 输入的原始XML字符串
String rawXml = "你的原始XML内容";
// 匹配message标签的正则,DOTALL模式让.可以匹配换行符
Pattern pattern = Pattern.compile("(<message>)(.*?)(</message>)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(rawXml);
StringBuffer safeXml = new StringBuffer();
while (matcher.find()) {
    // 只替换标签内容中的&为&amp;
    String escapedContent = matcher.group(2).replace("&", "&amp;");
    matcher.appendReplacement(safeXml, matcher.group(1) + escapedContent + matcher.group(3));
}
matcher.appendTail(safeXml);
// 用处理后的safeXml做JAXB反序列化即可

只要你的XML中不存在嵌套的<message>标签,该方案100%可靠。

方案2:使用容错XML解析器做预处理

如果后续可能有其他标签也出现未转义特殊字符的情况,可以使用容错性高的XML解析工具(如Jsoup)先对输入XML做格式化,自动修复所有未转义的特殊字符,再喂给JAXB做反序列化,无需自己维护匹配逻辑。
Java代码示例:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.parser.Parser;

String rawXml = "你的原始XML内容";
// 用Jsoup的XML模式解析,自动修复未转义的&等非法字符
Document doc = Jsoup.parse(rawXml, "", Parser.xmlParser());
doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
String safeXml = doc.html();
// 用处理后的safeXml做JAXB反序列化即可

该方案通用性更强,适合XML结构可能变动的场景,对中小体积的JMS消息性能完全足够。

不可行的方案说明

不要尝试通过配置JAXB Unmarshaller的ErrorHandler忽略该异常:未转义的&属于XML规范级别的致命错误,标准SAX解析器无法跳过该错误继续解析,强制忽略只会得到不完整的解析结果。


内容的提问来源于stack exchange,提问作者hell_storm2004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:54:04