繁体   English   中英

如何使用JAXB编写深层XML文档?

[英]How do I write a deep XML document using JAXB?

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

  • Band类,标识图像上垂直的颜色带。 目前,它在图像上的位置只有X值。
  • 程序类,“程序”表示某种图像的模板。 它具有图像上带的数量,程序的名称以及带对象的列表。
  • 一个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是例外配置,因此您添加了许多不必要的注释。 以下内容应有所帮助:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM