首页 > 解决方案 > 在构造函数中创建 XML

问题描述

所以我正在研究一个现有的项目,我正在尝试重构它。它使用 XML,当前代码如下所示:

有一个类用于生成 XML:

import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import hr.pbz.jhex.engine.xml.XmlMarshaller;

@XmlRootElement(name = "root")
public class MyXmlClass extends XmlMarshaller{

    private String string1;
    private String string2;

    public String getString1() {
        return string1;
    }

    @XmlAttribute
    public void setString1(String string1) {
        this.string1 = string1;
    }

    public String getString2() {
        return string2;
    }

    @XmlAttribute
    public void setString2(String string2) {
        this.string2 = string2;
    }

}

它在 Main.java 中使用

MyXmlClass myXml = new MyXmlClass()
myXml.setString1("foo");
myXml.SetString2("bar");

这就像它应该的那样工作,并产生了良好的结果。

问题是,在我的真实代码中,字段远不止string1、string2,而且仅仅设置XML会使用很多代码行。

我的问题是,我可以在 MyXmlClass 中使用构造函数吗?就像是:

import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import hr.pbz.jhex.engine.xml.XmlMarshaller;

@XmlRootElement(name = "root")
public class MyXmlClass extends XmlMarshaller{

    private String string1;
    private String string2;

    public MyXmlClass() { //doesn't work without the default noargs constructor
    }

    public MyXmlClass(String string1, String string2) {
           this.string1 = string1;
           this.string2 = string2;
    }

    public String getString1() {
        return string1;
    }

    @XmlAttribute
    public void setString1(String string1) {
        this.string1 = string1;
    }

    public String getString2() {
        return string2;
    }

    @XmlAttribute
    public void setString2(String string2) {
        this.string2 = string2;
    }

}

然后在 Main.java 中使用它,例如:

MyXmlClass myXml = new MyXmlClass("foo", "bar");

我已经尝试过了,它产生的结果好坏参半。有时它会像它应该的那样工作,而在其他地方则不然。

===编辑===

应该更清楚“不是那么多”部分,这里有一个例子。

假设现在我正在使用一个不仅仅是 2 个字段的 XmlClass,比如说 4 个。

我首先实例化它,提供 2 个参数,如下所示:

MyXmlClass myXml = new MyXmlClass("foo", "bar");

然后我决定使用 setter 设置第三个和第四个字段。

myXml.setElement3("set after instantiating");
myXml.setElement4("also after instantiating");

如果我按此顺序执行此操作,则 xml 不包含我设置调用 setElement4 的元素。如果我交换他们的位置,像这样:

myXml.setElement4("also after instantiating");
myXml.setElement3("set after instantiating");

它工作正常,所有元素都显示出来。我正在使用的类非常大,因此为此线程设置 MCVE 需要一些时间,但我会尝试一下。发布这个只是为了看看这是否有效,或者我正在做一些真正不应该做的骇人听闻的事情,这就是为什么程序在某些情况下表现得很奇怪。

===编辑===

使用构造函数以这种方式进行操作是否安全?谢谢。

标签: javaxmljaxb

解决方案


推荐阅读