将包含属性值的 XML 转换为 Java 对象时出错

Error in converting XML containing attribute values to Java Object

我需要将 XML 解组为 Java 对象,我已经尝试使用以下代码但它给出了异常-

主要Class-

JAXBContext context = JAXBContext.newInstance(SimpleBean.class);
             Unmarshaller unMarshaller = context.createUnmarshaller();
             File file = ResourceUtils.getFile("classpath:config/SimpleBean.xml");
             SimpleBean param = (SimpleBean) unMarshaller.unmarshal(new FileInputStream(file));
             LOGGER.info("param: "+param.getRoot());

SimpleBean.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class SimpleBean {    

    @JsonProperty("root")
    private Root root;

    public Root getRoot() {
        return root;
    }

    public void setRoot(Root root) {
        this.root = root;
    }

}

Root.java

public class Root {
    @JsonProperty("Schedule")
    private List<Schedule> schedule;

    public List<Schedule> getSchedule() {
        return schedule;
    }

    public void setSchedule(List<Schedule> schedule) {
        this.schedule = schedule;
    }
}

Schedule.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class Schedule {
    @JsonProperty("ID")
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

SimpleBean.xml

<root>
<Schedule ID="561"></Schedule>
<Schedule ID="562"></Schedule>
</root>

异常来了-

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"root"). Expected elements are (none)

您需要像这样定义一个 @XmlRootElement

@XmlRootElement(name="root")
public class Root {
    @JsonProperty("Schedule")
    private List<Schedule> schedule;

    public List<Schedule> getSchedule() {
        return schedule;
    }

    public void setSchedule(List<Schedule> schedule) {
        this.schedule = schedule;
    }
}

此外,您不需要另一个包装器 POJO (SimpleBean)。 你应该直接这样做(否则你会得到 ClassCastException):

Root param = (Root) unMarshaller.unmarshal(new FileInputStream(file));
LOGGER.info("param: "+param);

这是一个可行的解决方案-

SomeRoot.java-

@XmlRootElement(name="root")
public class SomeRoot{
    private List<Schedule> schedule;

    @XmlElement(name = "Schedule")
    public List<Schedule> getSchedule() {
        return schedule;
    }

    public void setSchedule(List<Schedule> schedule) {
        this.schedule = schedule;
    }
}

Schedule.java -

public class Schedule {
    private String id;

    @XmlAttribute(name = "ID")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

然后在java代码中-

         JAXBContext context = JAXBContext.newInstance(SomeRoot.class);
         Unmarshaller unMarshaller = context.createUnmarshaller();
         File file = ResourceUtils.getFile("classpath:config/SomeRoot.xml");
         SomeRoot param = (SomeRoot) unMarshaller.unmarshal(file);
         List<Schedule> schedules = param.getSchedule(); 
         for (Schedule schedule : schedules) { 
           LOGGER.info("Schedule: "+schedule.getId()); 
         }