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

使用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规范中,&是预定义特殊字符,必须转义为&amp;才能被合法解析。直接使用未转义的&会导致XML本身无效,Jackson依赖的底层XML解析器(默认是StAX)会直接抛出异常。

解决方案

方案1:修正XML字符串(推荐)

直接将XML中的&替换为&amp;,让XML符合规范:

String myXML = "<cookies>Chocolate&amp;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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:45:34