在构造函数中创建XML

时间:2018-05-09 08:16:30

标签: java xml jaxb

所以我正在处理一个现有的项目,我试图重构它。它使用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");

我试过了,它产生了混合的结果。有时它会像它应该的那样工作,而在其他地方则不那么多。

=== EDIT ===

应该更清楚地了解'不要那么多'部分,这是一个例子。

让我们说现在我正在使用超过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,但我会尝试一下。发布这个只是为了看看这是否有效,或者我做了一些真正不应该做的hacky事情,这就是为什么程序在某些情况下表现得很奇怪。

=== EDIT ===

使用构造函数这样做是否安全?感谢。

0 个答案:

没有答案