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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:09:02