将ObservableList和一个整数保存/加载为XML

时间:2018-06-25 12:26:41

标签: java xml javafx jaxb

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绑定有些困惑,有人可以给我提示或告诉我我在做什么错吗?
提前致谢。

1 个答案:

答案 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);
    }
}