3

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.

1 Answer 1

4

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;
        }
    }

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.