I have the following xml and i want to parse it with 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>
having the following
@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;
}
}
}
gives me the error org.simpleframework.xml.core.ConstructorException: Can not construct inner class.
There are couple of things to be careful about.
1) if you have nested class for Attributes in inner Elements the nested class must be static.
2) defining variable for inner class must annotate as follows
@Element(name = "title", type = Title.class, required = false)
private Title title;
3) inside constructor they should instantiate an empty class
this.title = new Title();
This is a full working version:
@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;
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With