JAXB解析嵌套XML仅能获取学生数据无法读取教师数据问题咨询
问题说明
使用JAXB对嵌套XML做反序列化时,可正常解析学生数据,但教师节点解析结果为null,预期可同时读取学生和教师的所有数据。
原XML结构
<?xml version="1.0" encoding="UTF-8"?> <school> <students> <student> <firstName>A</firstName> <id>1</id> <lastName>C</lastName> <company>BCD</company> <responsibilities> <responsibility>Leader</responsibility> <responsibility>Dancer</responsibility> <responsibility>Reporter</responsibility> </responsibilities> </student> <student> <firstName>B</firstName> <id>2</id> <lastName>C</lastName> <company>EFG</company> <responsibilities> <responsibility>Singer</responsibility> </responsibilities> </student> </students> <Teachers> <Teacher> <firstName>A</firstName> <lastName>C</lastName> <responsibilities> <responsibility>English</responsibility> <responsibility>Hindi</responsibility> <responsibility>Softskills</responsibility> </responsibilities> </Teacher> <Teacher> <firstName>A</firstName> <lastName>C</lastName> <company>BCD</company> <responsibilities> <responsibility>Science</responsibility> <responsibility>Math</responsibility> </responsibilities> </Teacher> </Teachers> </school>
问题原因梳理
- 字段类型定义错误:XML中
<students>、<Teachers>都是单个父节点,内部包裹子节点,School类中对应字段错误定义为List类型,导致映射失败。 - 大小写匹配问题:JAXB默认严格匹配标签名与字段名,XML中
<students>首字母小写、<Teachers>首字母大写、<id>首字母小写,与实体类字段名大小写不一致,未显式指定映射关系。 - 缺少getter/setter方法:Teacher、Responsibilities类未添加@Data注解,JAXB无法通过getter/setter注入属性值。
- 冗余类:单独定义的Responsibility类无用,可直接删除,Responsibilities类中用
List<String>即可接收所有<responsibility>标签的文本内容。
修正代码
1. School类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @Data @XmlRootElement(name = "school") public class School { @XmlElement(name = "students") private Students students; @XmlElement(name = "Teachers") private Teachers teachers; }
2. Students类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; import java.util.List; @Data public class Students { @XmlElement(name = "student") private List<Student> student; }
3. Student类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; @Data public class Student { @XmlElement(name = "id") private long id; private String firstName; private String lastName; private String company; @XmlElement(name = "responsibilities") private Responsibilities responsibilities; }
4. Responsibilities类
import lombok.Data; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import java.util.List; @Data @XmlAccessorType(XmlAccessType.PROPERTY) public class Responsibilities { @XmlElement(name = "responsibility") public List<String> responsibility; }
5. Teachers类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; import java.util.List; @Data public class Teachers { @XmlElement(name = "Teacher") private List<Teacher> teacher; }
6. Teacher类
import lombok.Data; import javax.xml.bind.annotation.XmlElement; @Data public class Teacher { private String firstName; private String lastName; private String company; @XmlElement(name = "responsibilities") private Responsibilities responsibilities; }
验证
修正后运行主程序,即可通过entries.getTeachers().getTeacher()获取到所有教师节点数据,同时学生数据解析不受影响。
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad
相关产品推荐
相关产品推荐

