将包含属性值的 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());
}
我需要将 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());
}