使用XmlMapper解析含&的XML报错,求字符转义及配置方法
问题解析与解决
使用fasterxml.jackson.xml.XmlMapper解析包含&字符的XML字符串时,会抛出如下异常:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Unexpected character '&' in prolog; expected '<'.
问题代码
import java.util.Map; import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class MyProblem { public static void main(String[] args) { XmlMapper xmlMapper = new XmlMapper(); String myXML = "<cookies>Chocolate&Butter coconut</cookies>"; Map<String, String> myTester = xmlMapper.reader().readValue(myXML, Map.class); System.out.println(myTester); } }
核心原因
XML规范中,&是预定义特殊字符,必须转义为&才能被合法解析。直接使用未转义的&会导致XML本身无效,Jackson依赖的底层XML解析器(默认是StAX)会直接抛出异常。
解决方案
方案1:修正XML字符串(推荐)
直接将XML中的&替换为&,让XML符合规范:
String myXML = "<cookies>Chocolate&Butter coconut</cookies>";
修改后运行代码,会正常输出{cookies=Chocolate&Butter coconut}。
方案2:配置XmlMapper容忍未转义字符(应急用)
如果无法修改原始XML字符串,可以通过配置XmlMapper的底层解析器,强制它处理不规范的XML。具体步骤是自定义XMLInputFactory的属性,再注入给XmlMapper:
import javax.xml.stream.XMLInputFactory; import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class MyProblem { public static void main(String[] args) throws Exception { XmlMapper xmlMapper = new XmlMapper(); // 配置StAX解析器的宽松模式 XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); inputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); // 将自定义工厂绑定到XmlMapper xmlMapper.getFactory().setXMLInputFactory(inputFactory); String myXML = "<cookies>Chocolate&Butter coconut</cookies>"; Map<String, String> myTester = xmlMapper.reader().readValue(myXML, Map.class); System.out.println(myTester); } }
⚠️ 注意:这种做法违反XML规范,可能引发其他解析异常或安全问题,仅建议在无法修改原始XML的极端场景下使用。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

