是否可以使用multiple";将多个Java类对象序列化为单个XML文件;根“;元素?

是否可以使用multiple";将多个Java类对象序列化为单个XML文件;根“;元素?,java,xml,serialization,jaxb,Java,Xml,Serialization,Jaxb,我正在为一个应用程序处理相当复杂和大量的用户设置。我明智地决定将它分解为几个更小、更简单的类,每个类负责一组特定的用户设置,而不是让一个单一的megalithic类负责每个设置 为了简单起见(我希望如此),我希望将这些设置实例中的每一个都存储在一个XML文件中,并防止文件数量变得过于庞大 所以我们来回答我的问题: 如果我有一个包含单个根元素的XML文件,是否可以在同一个根元素中存储多个对象,并在以后提取它们,或者更理想的情况下(为了使其更具可读性),是否可以在一个XML文件中以不同的根元素名称存

我正在为一个应用程序处理相当复杂和大量的用户设置。我明智地决定将它分解为几个更小、更简单的类,每个类负责一组特定的用户设置,而不是让一个单一的megalithic类负责每个设置

为了简单起见(我希望如此),我希望将这些设置实例中的每一个都存储在一个XML文件中,并防止文件数量变得过于庞大

所以我们来回答我的问题: 如果我有一个包含单个根元素的XML文件,是否可以在同一个根元素中存储多个对象,并在以后提取它们,或者更理想的情况下(为了使其更具可读性),是否可以在一个XML文件中以不同的根元素名称存储多个对象?例如:下面的例子可以吗

@XMLRootElement(name = "Settings")
public class EQLGameSettings{
    @XmlElement(name="PlayerCount")
    final private Integer PlayerCount;
    @XmlElement(name="GameMode")
    final private EQLGameMode Mode;
    @XmlElement(name="WinnerOnNewGame")
    final private Boolean WinnerOnNewGame;
    .
    .
    .
}
是否将它们存储在同一个根元素下的同一个XML文件中,并在以后反序列化

@XMLRootElement(name = "Settings")
public class EQLScoreSettings{
    @XmlElement(name="ScoreValue")
    final private Integer ScoreValue;
    @XmlElement(name="PenaltyImposed")
    final private Integer PenaltyImposed;
    @XmlElement(name="VictoryScore")
    final private Integer VictoryScore;
    .
    .
    .
}
然后能够将它们反序列化为各自类的新实例:

JAXBContext EQLGameSettingsContext = JAXBContext.newInstance("EQLGameSettings"),
            EQLScoreSettingsContext = JAXBContext.newInstance("EQLScoreSettings");

Unmarshaller UM = EQLGameSettingsContext.createUnmarshaller();

File settingsXML = new File("path/to/Settings.xml");
EQLGameSettings = (EQLGameSettings) UM.unmarshal(settingsXML);

//And then be able to use the same file with and get a Score Settings instance like so:
UM = EQLScoreSettingsContext.createUnmarshaller();
EQLScoreSettings = (EQLScoreSettings) UM.unmarshal(settingsXML);
这样行吗?或者,即使尝试在同一个XML文件中存储多个对象,是否每次都会重写它?或者接下来的工作会怎么样

@XMLRootElement(name = "GameSettings")
public class EQLGameSettings{
    .
    .
    .
}

@XMLRootElement(name = "ScoreSettings")
public class EQLScoreSettings{
    .
    .
    .
}

JAXBContext EQLGameSettingsContext = JAXBContext.newInstance("EQLGameSettings"),
            EQLScoreSettingsContext = JAXBContext.newInstance("EQLScoreSettings");

Unmarshaller UM = EQLGameSettingsContext.createUnmarshaller();

File settingsXML = new File("path/to/Settings.xml");
EQLGameSettings = (EQLGameSettings) UM.unmarshal(settingsXML);

//And then be able to use the same file with and get a Score Settings instance like so:
UM = EQLScoreSettingsContext.createUnmarshaller();
EQLScoreSettings = (EQLScoreSettings) UM.unmarshal(settingsXML);
前面的任何一个或所有内容都可以工作吗?还是我必须为每个设置实例生成一个XML文件

编辑:看起来这不是一个选项。我仍然不想经历为每个设置类维护XML文件的痛苦。我的下一个想法是使用每个设置类,而是使其可序列化。因此,我可以这样做,而不是尝试将每个设置放入XML文件:

@XmlRootElement("Settings")
public class MasterSettings{
    @XmlElement("GameSettings")
    EQLGameSettings GameSettings;
    @XmlElement("ScoreSettings")
    EQLScoreSettings ScoreSettings;
}

JAXBContext SettingsContext = JAXBContext.newInstance("MasterSettings");
Unmarshaller UM = SettingsContext.createUnmarshaller();
File SettingsFile = new File("Path/To/Settings.xml");

MasterSettings Settings = (MasterSettings)UM.unmarshal(SettingsFile);

我很有信心这会起作用,但接下来我需要问的问题是,如何设置一个类,以便以这种方式序列化它?

不可能在一个xml中序列化多个根元素。。e、 g

<parentA>
    <child>
        Text
    </child>
</parentA>
<parentB>
    <child>
        Text
    </child>
</parentB>

正文
正文
你可以这样试试

<wrapperElement>
    <parentA>
        <child>
            Text
        </child>
    </parentA>
    <parentB>
        <child>
            Text
        </child>
    </parentB>
</wrapperElement>

正文
正文

根必须始终为1。

XML基于XSD,因此您不能这样说

有关更多信息,请参阅


但是在

中有一个解决办法,请允许我说事情比你想象的要简单得多:)

编写一个Java类,该类反映要存储在一个XML文件中的所有内容的结构。根据你漫无边际的描述,它可能类似于下面的类。(请注意,我正在演示如何实现一个重复元素——如果只需要一次引用,请使用其他模式)

@XmlRootElement(“设置”)
@XmlAccessorType(XmlAccessType.PROPERTY)
公共类设置{
私人列表游戏设置;
私人计分;
@XmlElement
公共列表getGameSetting(){
如果(游戏设置==null){
gameSetting=新建ArrayList();
}
返回游戏设置;
}
@XmlElement
public ScoreSetting getScoreSetting(){
返回分数设置;
}
公共无效设置分数设置(分数设置值){
分数设置=数值;
}
}
然后,您就有了GameSetting和ScoreSetting类,非常像这个(但是您可以省略
@XmlRootElement


您可以构建对象层次结构,并封送一个
设置的单个对象,仅此而已。解组后,您可以访问项目和子项目。

使用xml时,您几乎需要读/写整个文档。您应该用所有类创建一个层次结构,并将其作为一个实例进行读/写。@jtahlborn当您说“用所有类创建一个层次结构”时,我不确定我是否理解您的意思。我打算创建一个“主设置”类,将所有设置类合并到一个对象中,但我认为在每个设置类中都有每个值的访问器是多余的。那是指你说的,还是别的什么?
@XmlRootElement("Settings")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Settings {
    private List<GameSetting> gameSetting;
    private ScoreSetting scoreSetting;
    @XmlElement
    public List<GameSetting> getGameSetting(){
        if( gameSetting == null ){
            gameSetting = new ArrayList<>();
        }
        return gameSetting;
    }
    @XmlElement
    public ScoreSetting getScoreSetting(){
        return scoreSetting;
    }
    public void setScoreSetting( ScoreSetting value ){
        scoreSetting = value;
    }
}