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

解析XML时遭遇XStream的com.thoughtworks.xstream.converters.ConversionException错误求助

我之前也踩过XStream解析XML的坑,结合你给出的XML结构和抛出的ConversionException,大概率是实体类与XML结构不匹配或者XStream映射配置缺失导致的,咱们一步步来排查解决:

可能的核心原因
  • 实体类字段与XML节点/属性的映射不对应:比如student节点的student_id属性没有标记为XML属性,或者marks下的forth字段拼写错误(比如写成fourth)
  • 未启用XStream的注解支持,或者没有手动配置节点别名
  • 嵌套类(比如Marks)没有正确关联到父类Student中
对应的解决办法(附示例代码)

首先要根据你的XML结构,编写完全匹配的实体类,并配置XStream的映射规则:

1. 编写匹配的实体类

Students 类(对应根节点<students>)

import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;

@XStreamAlias("students")
public class Students {
    // 如果XML中<students>下有多个<student>,建议添加@XStreamImplicit(itemFieldName="student")注解
    private List<Student> student;

    // Getter & Setter
    public List<Student> getStudent() {
        return student;
    }

    public void setStudent(List<Student> student) {
        this.student = student;
    }
}

Student 类(对应<student>节点)

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("student")
public class Student {
    // 用@XStreamAsAttribute标记这是XML的属性,而非子节点
    @XStreamAsAttribute
    private int student_id;
    private String firstname;
    private String lastname;
    private Marks marks;

    // Getter & Setter
    public int getStudent_id() {
        return student_id;
    }

    public void setStudent_id(int student_id) {
        this.student_id = student_id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Marks getMarks() {
        return marks;
    }

    public void setMarks(Marks marks) {
        this.marks = marks;
    }
}

Marks 类(对应<marks>节点)

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("marks")
public class Marks {
    // 字段名必须和XML子节点完全一致,这里是forth不是fourth!
    private int first;
    private int second;
    private int third;
    private int forth;

    // Getter & Setter
    public int getFirst() {
        return first;
    }

    public void setFirst(int first) {
        this.first = first;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }

    public int getThird() {
        return third;
    }

    public void setThird(int third) {
        this.third = third;
    }

    public int getForth() {
        return forth;
    }

    public void setForth(int forth) {
        this.forth = forth;
    }
}

2. 正确配置XStream解析代码

一定要记得启用注解支持,否则XStream无法识别你标记的映射规则:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XStreamXmlParser {
    public static void main(String[] args) {
        String xmlContent = "<students> <student student_id=\"1\"> <firstname>Lily</firstname> <lastname>Brown</lastname> <marks> <first>62</first> <second>90</second> <third>94</third> <forth>93</forth> </marks> </student> </students>";

        // 初始化XStream,指定DomDriver处理XML
        XStream xstream = new XStream(new DomDriver());
        // 启用注解支持,注册所有实体类
        xstream.processAnnotations(new Class[]{Students.class, Student.class, Marks.class});

        try {
            // 解析XML为Java对象
            Students students = (Students) xstream.fromXML(xmlContent);
            System.out.println("解析成功:学生姓名为 " + students.getStudent().get(0).getFirstname());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
额外排查点

如果按照上述步骤还是报错,可以检查以下内容:

  • 检查XStream版本:建议使用1.4.19及以上的稳定版本,旧版本可能存在注解支持的bug
  • 检查XML内容:确保没有未转义的特殊字符(如&、<等),如果有需要提前转义
  • 如果不使用注解,改用手动映射:比如调用xstream.alias("students", Students.class)、xstream.useAttributeFor(Student.class, "student_id")来配置映射规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:07:40