Jackson-dataformat-xml解析XML时转义字符处理问题咨询
Jackson XML解析:控制实体转义字符的处理
默认情况下,Jackson的XML解析器会遵循XML规范,将&这类实体转义字符解码为对应的原始字符(比如&)。如果你需要改变这一行为,让POJO中保留原始的&字符串,可以通过以下方式配置:
自定义XmlMapper禁用实体解码
核心思路是给底层XML输入工厂设置属性,关闭实体引用替换功能:
import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlFactory; import com.ctc.wstx.stax.WstxInputFactory; public class CustomXmlMapper { public static XmlMapper getNonDecodingMapper() { WstxInputFactory inputFactory = new WstxInputFactory(); // 关闭实体引用替换,保留原始转义字符串 inputFactory.setProperty(WstxInputFactory.P_REPLACE_ENTITY_REFS, false); // 禁用外部实体,避免安全风险 inputFactory.setProperty(WstxInputFactory.P_SUPPORT_EXTERNAL_ENTITIES, false); XmlFactory xmlFactory = new XmlFactory(inputFactory); return new XmlMapper(xmlFactory); } }
使用这个自定义的XmlMapper解析XML:
String xmlContent = "<example>Air \"B&B\"</example>"; XmlMapper mapper = CustomXmlMapper.getNonDecodingMapper(); ExamplePojo pojo = mapper.readValue(xmlContent, ExamplePojo.class); // 此时pojo中的对应字段值为"Air \"B&B\""
说明
- 这里使用了Jackson XML模块默认依赖的Woodstox解析器,若使用其他解析器(如JDK内置的StAX实现),需找到对应的实体替换配置属性。
- 禁用实体解析后,所有XML实体(如
<、>、"等)都会以原始转义形式保留,而非被解码为对应字符。 - 务必禁用外部实体支持,防止XML实体注入安全风险。
内容的提问来源于stack exchange,提问作者Javadee
相关产品推荐
相关产品推荐

