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()) { // 只替换标签内容中的&为& String escapedContent = matcher.group(2).replace("&", "&"); 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
相关产品推荐
相关产品推荐

