使用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结构,调整解析逻辑:
- 定义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; } }
- 调整解析代码:
final XmlMapper mapper = new XmlMapper(); TerraformConfigXml config = mapper.readValue(reader, TerraformConfigXml.class); // 获取到的terraformCode就是节点内的HCL配置内容,可后续用HCL解析工具处理 String hclContent = config.getTerraformCode();
内容的提问来源于stack exchange,提问作者rasilvap
相关产品推荐
相关产品推荐

