2017-01-12 12 views
2

私は以下のXMLを持っており、simpleXMLで解析したいと思っています。Java SimpleXMLでネストされたオブジェクトを逆シリアル化する方法

<programme start="20161107190000 GMT+04:00" stop="20161107200000 GMT+04:00" channel="001"> 
    <title lang="en_GB">Foo</title> 
    <desc lang="en_GB">Foobarbaz</desc> 
</programme> 
<programme start="20161107200000 GMT+04:00" stop="20161107203000 GMT+04:00" channel="001"> 
    <title lang="en_GB">JLS</title> 
    <desc lang="en_GB">The Java Language Specification</desc> 
</programme> 

@Root 
public class Programme { 

    @Attribute(name = "channel", required = false) 
    private String channel; 

    @Attribute(name = "start", required = false) 
    private String start; 

    @Attribute(name = "stop", required = false) 
    private String stop; 

    @Element(name = "title", required = false) 
    private Title title; 

    @Element(name = "desc", required = false) 
    private String desc; 

    public Programme(String channel, String start, String stop, String title, String desc) { 
     this.channel = channel; 
     this.start = start; 
     this.stop = stop; 
     this.title = title; 
     this.desc = desc; 
    } 

    public String getChannel() { 
     return channel; 
    } 

    public void setChannel(String channel) { 
     this.channel = channel; 
    } 

    public String getStart() { 
     return start; 
    } 

    public void setStart(String start) { 
     this.start = start; 
    } 

    public String getStop() { 
     return stop; 
    } 

    public void setStop(String stop) { 
     this.stop = stop; 
    } 

    public Title getTitle() { 
     return title; 
    } 

    public void setTitle(Title title) { 
     this.title = title; 
    } 

    public String getDesc() { 
     return desc; 
    } 

    public void setDesc(String desc) { 
     this.desc = desc; 
    } 

    @Root(name = "title") 
    public class Title { 

     @Attribute 
     private String lang; 

     private String text; 

     public Title(String lang, String text) { 
      this.lang = lang; 
      this.text = text; 
     } 

     public String getLang() { 
      return lang; 
     } 

     public void setLang(String lang) { 
      this.lang = lang; 
     } 

     @Text 
     public String getText() { 
      return text; 
     } 

     @Text 
     public void setText(String text) { 
      this.text = text; 
     } 
    } 

} 

を持つことは私にエラーorg.simpleframework.xml.core.ConstructorException: Can not construct inner classを与えます。

答えて

2

注意すべきことがいくつかあります。

1)内部要素に属性のネストされたクラスがある場合、ネストされたクラスはstaticでなければなりません。

@Element(name = "title", type = Title.class, required = false) 
private Title title; 

3を次のようにインナークラスの変数を定義

2)注釈しなければならない)コンストラクタ内部それらは空のクラスを

this.title = new Title(); 

をインスタンス化する必要がありこれが完全に動作するバージョンである:

@Root 
public class Programme { 


    @Attribute(name = "channel", required = false) 
    private final String channel; 

    @Attribute(name = "start", required = false) 
    private final String start; 

    @Attribute(name = "stop", required = false) 
    private final String stop; 


    @Element(name = "title", type = Title.class, required = false) 
    private Title title; 

    @Element(name = "desc", type = Desc.class, required = false) 
    private Desc desc; 

    public Programme(
      @Attribute(name = "channel") String channel, 
      @Attribute(name = "start") String start, 
      @Attribute(name = "stop") String stop 
    ) { 
     this.channel = channel; 
     this.start = start; 
     this.stop = stop; 
     this.title = new Title(); 
     this.desc = new Desc(); 
    } 

    public Title getTitle() { 
     return title; 
    } 

    public void setTitle(Title title) { 
     this.title = title; 
    } 

    public Desc getDesc() { 
     return desc; 
    } 

    public void setDesc(Desc desc) { 
     this.desc = desc; 
    } 


    @Root(name = "title") 
    public static class Title { 
     public String text; 
     @Attribute(name = "lang") 
     private String lang; 

     @Text 
     public String getText() { 
      return text; 
     } 

     @Text 
     public void setText(String text) { 
      this.text = text; 
     } 

     public String getLang() { 
      return lang; 
     } 
    } 

    @Root(name = "desc") 
    public static class Desc { 
     public String text; 
     @Attribute(name = "lang") 
     private String lang; 

     @Text 
     public String getText() { 
      return text; 
     } 

     @Text 
     public void setText(String text) { 
      this.text = text; 
     } 

     public String getLang() { 
      return lang; 
     } 
    } 

} 
関連する問題