2016-09-07 3 views
0

このリンク:JAXB Unmarshalling XML string - Looping through all tags 良い解決策が提案されました。 私はそれから利益を得ようとしていますが、私の場合はそれを働かせることができません。Unmarshalオブジェクト内のJavaループ

<campaign value="field1"> 
    <name value="firstName"/> 
    <type value="type"/> 
    <record> 
    <firstTime value="13"/> 
    <secondTime value="14"/> 
    </record> 
</campaign> 

とアンマーシャリングのためのすべてのクラスを検討し、作成し、作業:

は、このようなXMLを考えてみましょう。私は「名前」と「タイプ」の値を抽出しますが、理由リスト<のできる キャンペーンクラス、名前を含む、値、レコードの[]など

JAXBContext c = JAXBContext.newInstance(Campaign.class); 
Unmarshaller u = c.createUnmarshaller(); 
Campaign campaign = (Campaign) u.unmarshal(file); 

>は、私が越えて行くことができないのですこの。

private String Name = null; 
[...] 
Name = campaign.getName().getValue(); 
System.out.println(Name); 

どのようにループ<record>にだろう、と他のXMLファイル内<record>以上があるかもしれないことを知って、FIRSTTIMEとsecondTimeのすべての値を取得しますか?

EDIT: キャンペーンクラス

@XmlRootElement(name = "Campaign") 
@XmlType(name = "Campaign", propOrder = { 
    "Name", 
    "Type", 
    "Record" }) 
public class Campaign { 
    @XmlElement(required = true) 
    protected Name Name; 

    @XmlElement(required = true) 
    protected Type Type; 

    @XmlElement(required = true) 
    protected List<Record> Record= new ArrayList<Record>(); 


    public Name getName() {return Name;} 
    public void setName (Name value) {this.Name= value;} 

    public Type getType() {return Type;} 
    public void setType (Type value) {this.Type = value;} 

    public void setRecord(Recordvalue) {this.Record.add(value);} 
} 

録音クラス

@XmlRootElement(name = "Record") 
@XmlType(name = "Record", propOrder = { 
    "firstTime", 
    "secondTime" }) 
public class Record{ 
    @XmlElement(required = true) 
    protected firstTime firstTime; 

    @XmlElement(required = true) 
    protected secondTime secondTime; 


    public Name getFirstTime() {return firstTime;} 
    public void setFirstTime (firstTime value) {this.firstTime= value;} 

    public Name getSecondTime() {return secondTime;} 
    public void setSecondTime (secondTime value) {this.secondTime= value;} 
} 

プログラムがはるかに大きいですが、それだけで繰り返し続けて..私はすべてのものを抽出する必要があります後でDBにアップロードするために使用します。 しかし、私は画面上にそれらを印刷し、私が必要とするすべての値を持っていることを知っているだけです。

はい私はそのリンクも見ましたが、どうして私はちょうど続ける方法に集中できないのかわかりません、最悪の部分が私にとってより簡単だったようです!

おかげ

EDIT 3私はセットするためのメソッドを貼り付け、取得するのを忘れました。

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Type") 
public class Type { 

    @XmlAttribute 
    protected String value; 

    public String getValue() {return value;} 
    public void setValue(String value) {this.value = value;} 
} 

それは、私は単にここにタイプを貼り付け、すべて同じです。

EDIT 4:解決策 最後に解決策を見つけることができましたが、これは提案されたものではなく正しいものとしてマークされています。それは私がgetRecord()ゲッターを作成するのに役立ちました。

コードを変更することなく、レコードに追加します。クラス:

for (int i=1; i<=campaign.getRecord().size(); i++) {    System.out.println(campaign.getRecord().get(i-1).getFirstTime().getValue()); 
System.out.println(campaign.getRecord().get(i-1).getSecondTime().getValue()); 
} 

私は「13」と「14」を印刷することができる午前、より一般的には、私はrecordの内側とrecordを場合何かを印刷することができる午前:

public List<Record> getRecord() { return this.Record; } 

とメインクラスに

もう1つのリストが内部にあります:

for (int j=1; j<= campaign.getRecord().get(i-1).getANewListInsideRecord().size(); j++) { 
System.out.println(campaign.getRecord().get(i-1).getANewListInsideRecord().get(j-1).getAObject().getValue()); 
} 

このジョブを実行します。

-1これは0から始まるからです。

+0

アンマーシャリング要素を試してください。 参照:http://stackoverflow.com/questions/11152917/iterate-through-the-elements-in-jaxb –

+0

使用したマッピングを確認できるように、キャンペーンコードとレコードコードを追加できますか? –

+0

質問が更新されました。ありがとう – Nihvel

答えて

1

あなたの問題がまだ分かりません。私の答えがあなたが探しているものでないか教えてください。

@XmlRootElement(name = "campaign") 
@XmlType(name = "campaign", propOrder = { 
    "name", 
    "type", 
    "record" }) 
public class Campaign { 
    @XmlElement(required = true) 
    protected Name name; 

    @XmlElement(required = true) 
    protected Type type; 

    @XmlElement(required = true) 
    protected List<Record> record; 


    public Name getName() {return name;} 
    public void setName (Name value) {this.name= value;} 

    public Type getType() {return type;} 
    public void setType (Type value) {this.type = value;} 

    //Initialise your record list inside the getter instead of in member declaration 
    public List<Record> getRecord() { 
     if(this.record == null) record = new ArrayList<>(); 
     return this.record; 
    } 

    //Do not use a setter as an add method for the list 
    public void setRecord(List<Record> value) {this.record = value;} 

    //If you need to add record inside your list, do not use a setter, define an add method or access the list with the getter. 
    public void addRecord(Record value) {this.record.add(value);} 
} 

私はあなたがキャンペーンで使用されるクラスのすべてのために適切なのtoString()メソッドを定義しているという仮定の下に行くよ:

あなたが作るためにいくつかの変更があります。 exempleについては

、Recordクラスの文字列は次のように行くことがあります。すべてを表示する

@Override 
public String toString(){ 
    return " First value : + "this.firstTime.getValue() + " Second value : " +this.secondTime.getValue(); 
} 

List<File> files = new ArrayList<>(); 

//Add all XML Files containing a campaign root element into the files list 
JAXBContext c = JAXBContext.newInstance(Campaign.class); 
Unmarshaller u = c.createUnmarshaller(); 

//Declare list to store all of your camapaign object 
List<Campaign> campaigns = new ArrayList<>(); 

for(File f : files) 
{ 
    campaigns.add(u.unmarshall(f)); 
} 

//display all campaigns 
for(Campaign camp : campaigns){ 
    System.out.println(camp.getName()); 
    System.out.println(camp.getType()); 

    //Display all records 
    for(Record rec : camp.getRecord()){ 
     System.out.println(rec); 
    } 
} 

もちろん何にするSystem.out.println()の行を変更することができますあなたが望むコード。

+0

NICE!これは印象的です。あなたの側からあまりにも多くの仕事を期待していない!今日の私のシフトは終わった、私はできるだけ早くそれに取り組んでいます。私は最高の答えとしてこれを受け入れるつもりだと言いたいと思います。 – Nihvel

+0

私は自分の質問を更新しましたが、私はあなたの最高の答えとしてマークしていますが、コードを使って解決しました。私が欠けていたもの – Nihvel

関連する問題