im当前正在尝试将ObservableList和double变量保存为XML文档。不知何故,保存是未排序的(变量在声明时未排序),并且加载根本不起作用。
首先,我的ObservableList包含6个“ Week”对象。
周班:
public class Week {
double Montag;
double Dienstag;
double Mittwoch;
double Donnerstag;
double Freitag;
double Samstag;
double Sonntag;
public Week(double montag, double dienstag, double mittwoch, double donnerstag, double freitag, double samstag,
double sonntag) {
Montag = montag;
Dienstag = dienstag;
Mittwoch = mittwoch;
Donnerstag = donnerstag;
Freitag = freitag;
Samstag = samstag;
Sonntag = sonntag;
}
public double getMontag() {
return Montag;
}
public void setMontag(double montag) {
Montag = montag;
}
public double getDienstag() {
return Dienstag;
}
public void setDienstag(double dienstag) {
Dienstag = dienstag;
}
public double getMittwoch() {
return Mittwoch;
}
public void setMittwoch(double mittwoch) {
Mittwoch = mittwoch;
}
public double getDonnerstag() {
return Donnerstag;
}
public void setDonnerstag(double donnerstag) {
Donnerstag = donnerstag;
}
public double getFreitag() {
return Freitag;
}
public void setFreitag(double freitag) {
Freitag = freitag;
}
public double getSamstag() {
return Samstag;
}
public void setSamstag(double samstag) {
Samstag = samstag;
}
public double getSonntag() {
return Sonntag;
}
public void setSonntag(double sonntag) {
Sonntag = sonntag;
}
}
我制作了一个静态方法,该方法将返回XML字符串。 调用方法看起来像这样。
String xmlTest = XmlUtils.saveListAsXML(fxTable.getItems(),Double.parseDouble(fxWeek.getText()));
fxTable.getItems()将返回带有6个“ Week”对象的ObservableList,而另一个参数只是一个double。
我考虑过要创建另一个类“ Weeks”,该类将包含一个双变量和一个类型为“ week”的列表,然后序列化Weeks类。不知何故,它不按我的想法工作?
public static String saveListAsXML(ObservableList<Week> list, double Kalenderwoche) {
Weeks xmlObj = new Weeks();
xmlObj.setKalender(Kalenderwoche);
for (Week w : list) {
xmlObj.addToList(w);
}
StringWriter sw = new StringWriter();
JAXB.marshal(xmlObj, sw);
String xmlString = sw.toString();
return xmlString;
}
周班:
package Model;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Weeks {
@XmlElement
private double Kalenderwoche;
@XmlElement
ArrayList<Week> woche= new ArrayList<>();
public void addToList(Week week) {
woche.add(week);
System.out.println(week.Dienstag);
}
public void setKalender(double wert) {
Kalenderwoche = wert;
}
}
导出结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<weeks>
<Kalenderwoche>12.0</Kalenderwoche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>50.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>0.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>0.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>0.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>0.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
<woche>
<dienstag>0.0</dienstag>
<donnerstag>0.0</donnerstag>
<freitag>0.0</freitag>
<mittwoch>0.0</mittwoch>
<montag>0.0</montag>
<samstag>0.0</samstag>
<sonntag>0.0</sonntag>
</woche>
(请注意,在这种情况下,结构实际上很好,0.0值也正确。唯一困扰我的是,“ woche”部分的排序方式为:dienstag,donnerstag,freitag,mittwoch,montag,samstag,sonntag
,而不是像周对象montag,dienstag,mittwoch,donnerstag,freitag,samstag,sonntag
我还创建了一个静态方法,该方法应加载xml文件并从中创建Weeks对象。
方法看起来像这样:
public static ObservableList<Week> getXmlAsList(File file) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Weeks.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Weeks customer = (Weeks) jaxbUnmarshaller.unmarshal(file);
} catch (JAXBException e) {
e.printStackTrace();
}
ObservableList<Week> list = FXCollections.observableArrayList();
return list;
}
Method atm将只创建一个Weeks对象并返回一个空列表,但创建Weeks对象根本不起作用。
Jun 25, 2018 2:21:39 PM com.sun.xml.internal.bind.v2.ClassFactory create0
INFORMATION: No default constructor found on class Model.Week
java.lang.NoSuchMethodException: Model.Week.<init>()
我对XML绑定有些困惑,有人可以给我提示或告诉我我在做什么错吗?
提前致谢。
答案 0 :(得分:1)
Jaxb要求您提供不带参数的构造函数。您需要将这样的构造函数添加到Week
:
public Week() {
this(0d, 0d, 0d, 0d, 0d, 0d, 0d);
}
使用Week
为@XmlType.propOrder
指定属性的顺序
@XmlType(propOrder = {"montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag"})
public class Week {
此外,您应该通知用户xml解析失败,而不仅仅是返回空列表。 (无论如何,您都不应返回空列表。)
public static ObservableList<Week> getXmlAsList(File file) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Weeks.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Weeks customer = (Weeks) jaxbUnmarshaller.unmarshal(file);
return FXCollections.observableArrayList(customer.woche);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}