1

私が見た他の例よりも複雑な構造を持つ XML ドキュメントを作成しようとしています。3つのクラスを使用した私の試みは次のとおりです。

  • イメージ上の色の垂直バンドを識別する Band クラス。今のところ、画像上にある X 値のみを持っています。
  • Program クラス、「プログラム」は特定の種類の画像のテンプレートを意味します。イメージ上のバンドの数、プログラムの名前、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 オブジェクトのインスタンス化によって、それぞれ 2 つのバンドを持つ 2 つのプログラムが作成され、全体が XML ファイルになると予想していました。

私はこれをすべて間違っていますか?

私もこの行を試しました:

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

同じ結果です。

4

1 に答える 1

1

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 は例外による構成であるため、必要のない多くの注釈を追加しています。以下が役立ちます。

于 2013-01-15T13:22:41.850 に答える