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

使用XmlMapper解析XML报Unexpected character 't'错误如何解决?

错误根源

你遇到的报错核心是XmlMapper尝试解析的内容不符合预期的XML格式要求:
报错提示prolog中出现意外字符't'(编码116),期望'<',对应你给出的文件第二行第7位就是terraform的首字母t。当前你给出的文件虽然根节点是<content>,但节点内嵌套的是Terraform的HCL配置代码,不是合法的XML子节点结构,XmlMapper默认会将根节点后的所有内容按照XML规则解析,遇到非<开头的字符就会抛出解析异常。
另外你用CycloneDX的Bom类接收解析结果也不符合逻辑:Bom类对应的是CycloneDX格式的SBOM XML文件,这类文件的根节点固定为<bom>且有固定的XML结构,你当前的文件根本不是CycloneDX规范的SBOM文件,就算XML格式合法也无法反序列化为Bom对象。

排查步骤
  • 确认目标文件是否正确:你要解析的如果是CycloneDX生成的SBOM文件,首先检查你传入readValue方法的reader有没有误读取了存储Terraform配置的文件,正常CycloneDX SBOM文件不会嵌套HCL代码。
  • 确认解析需求是否匹配:如果你确实要解析当前这个嵌套Terraform代码的XML文件,就不能用CycloneDX的Bom类作为反序列化目标,需要自定义对应结构的POJO。
解决方案

根据你的实际需求选择对应处理方案:

需求1:解析CycloneDX格式的SBOM XML文件

直接替换读取的文件为CycloneDX工具输出的标准SBOM XML文件即可,你当前读取的文件不是目标解析文件。

需求2:解析当前包含Terraform代码的XML文件

需要自定义POJO适配当前的XML结构,调整解析逻辑:

  1. 定义XML对应的POJO类:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;

@JacksonXmlRootElement(localName = "content")
public class TerraformConfigXml {
    // 将content节点内的所有内容映射为字符串字段
    @JacksonXmlText
    private String terraformCode;

    public String getTerraformCode() {
        return terraformCode;
    }

    public void setTerraformCode(String terraformCode) {
        this.terraformCode = terraformCode;
    }
}
  1. 调整解析代码:
final XmlMapper mapper = new XmlMapper();
TerraformConfigXml config = mapper.readValue(reader, TerraformConfigXml.class);
// 获取到的terraformCode就是节点内的HCL配置内容,可后续用HCL解析工具处理
String hclContent = config.getTerraformCode();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:36:04