gpt4 book ai didi

java - 如何使用 JAXB 编写深度 XML 文档?

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:47 26 4
gpt4 key购买 nike

我正在尝试创建一个 XML 文档,该文档的结构比我见过的其他示例更复杂。这是我的尝试,使用三个类:

  • Band 类,标识图像上的垂直色带。目前,它只有图像上的 X 值。
  • 程序类,“程序”表示某种图像的模板。它包含图像上的 Band 数量、程序名称以及 Band 对象列表。
  • 一个 ProgramList 类,包含程序列表。

频段类别代码:

@XmlRootElement(name = "Band")
@XmlType(propOrder = { "x" })
public class Band {
private int x;

public Band() {
x = 0;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}
}

程序类代码:

@XmlRootElement(name = "Program")
@XmlType(propOrder = { "numBands" , "programName", "bandList"})
public class Program {

private int numBands;
private String programName;
private ArrayList<Band> bandlist;

public void Program() {
Band band1 = new Band();
band1.setX(14);
bandlist.add(band1);

Band band2 = new Band();
band2.setX(24);
bandlist.add(band2);
}

public void setNumBands(int nb) {
numBands = nb;
}

@XmlElement(name = "numBands")
public int getNumBands() {
return numBands;
}

public void setProgramName(String pn) {
programName = pn;
}

@XmlElement(name = "programName")
public String getProgramName() {
return programName;
}

public void setBandList(ArrayList<Band> bl) {
bandlist = bl;
}

@XmlElementWrapper(name = "bandlist")
public ArrayList<Band> getBandList() {
return bandlist;
}
}

ProgramList类代码:

@XmlRootElement()
@XmlType(propOrder = {"programList"})
public class ProgramList {

private ArrayList<Program> programlist;
public void ProgramList() {
Program program1 = new Program();
program1.setNumBands(2);
program1.setProgramName("Program 1");
programlist.add(program1);

Program program2 = new Program();
program2.setNumBands(2);
program2.setProgramName("Program 2");
programlist.add(program2);
}

public void setProgramList(ArrayList<Program> programlist) {
this.programlist = programlist;
}

@XmlElementWrapper(name = "programlist")
public ArrayList<Program> getProgramList() {
return programlist;
}
}

编码代码:(尝试编写它的另一个类的一部分)

private void writeXML() throws JAXBException, IOException  {
ProgramList pl = new ProgramList();

JAXBContext context = JAXBContext.newInstance(ProgramList.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(pl, new File("program.xml"));
}

编译一切正常,运行没有异常。但 XML 文档如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProgramList/>

不是我所期望的。我预计 ProgramList 对象的实例化会创建两个程序,每个程序有两个频段,并且整个程序最终会出现在 XML 文件中。

我做的这一切都是错的吗?

我也尝试过这一行:

JAXBContext context = JAXBContext.newInstance(new Class[] {ProgramList.class, Program.class, Band.class});

相同的结果。

最佳答案

以下不是构造函数,因为它具有 void 返回类型。它只是一个与构造函数同名的方法。这意味着该逻辑不会运行来填充您的对象模型。

public void ProgramList()   {
Program program1 = new Program();
program1.setNumBands(2);
program1.setProgramName("Program 1");
programlist.add(program1);

Program program2 = new Program();
program2.setNumBands(2);
program2.setProgramName("Program 2");
programlist.add(program2);
}

应该是:

public ProgramList()   {
programlist = new ArrayList<Program>(2);

Program program1 = new Program();
program1.setNumBands(2);
program1.setProgramName("Program 1");
programlist.add(program1);

Program program2 = new Program();
program2.setNumBands(2);
program2.setProgramName("Program 2");
programlist.add(program2);
}

注意:由于 JAXB 是异常(exception)配置,因此您添加了许多不必要的注释。以下内容应该有所帮助:

关于java - 如何使用 JAXB 编写深度 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14338525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com