解析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
相关产品推荐
相关产品推荐

