JAXB @XmlAttribute @XmlValue real example

后端 未结 1 1169
天涯浪人
天涯浪人 2021-01-11 15:20

I\'m new to JAXB and have troubles with conversion from XML to a Java class instance.

I have the following XML:




        
相关标签:
1条回答
  • 2021-01-11 15:57

    Thank you Blaise Doughan. But after dug more over 10 topics I decide I HAD TO to start with opposite way.

    I created new test which MARSHALLING my data (objects). Actually, I used TDD (test Driven Development) way I think. So, I filled up my Objects with test data and applied Marshalling (created XML from DATA) and saw that I got. Data Was Incorrect. I looked to other topic also (thanx this one Java/JAXB: Unmarshall Xml to specific subclass based on an attribute ) and correct my data Structure

    remember Id like to get

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <response>
        <code>1000</code>
        <message>Big message</message>
        <resData>
            <data name="svDate">2013.03.14</data>
        </resData>
    </response>
    

    Now my data are :

    package net.regmaster.onlinenic.model.response.resdata;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlValue;
    
    import org.eclipse.persistence.oxm.annotations.XmlCustomizer;
    
    /**
     * @author annik
     *
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name="data")
    //@XmlCustomizer(ResDataCustomiser.class)
    public class XmlData
    {
        @XmlAttribute(name="name")
        private String name;
    
        @XmlValue
        private String value;
    
        /** Getter.
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /** Setter.
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /** Getter.
         * @return the value
         */
        public String getValue() {
            return value;
        }
    
        /** Setter.
         * @param value the value to set
         */
        public void setValue(String value) {
            this.value = value;
        }
    }
    

    and :

    package net.regmaster.onlinenic.model.response.resdata;
    
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    /**
     * @author annik
     * 
     */
    @XmlRootElement
    public class ResData
    {
        private List<XmlData> data;
    
        /**
         * Getter.
         * 
         * @return the data
         */
        public List<XmlData> getData() {
            return data;
        }
    
        /**
         * Setter.
         * 
         * @param data
         *            the data to set
         */
        public void setData(List<XmlData> data) {
            this.data = data;
        }
    }
    

    and :

    package net.regmaster.onlinenic.model.response;
    
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElements;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlTransient;
    import javax.xml.bind.annotation.XmlType;
    
    import net.regmaster.onlinenic.enumtype.OnicEnumAction;
    import net.regmaster.onlinenic.enumtype.OnicEnumCategory;
    import net.regmaster.onlinenic.model.response.resdata.ResData;
    import net.regmaster.onlinenic.model.response.resdata.XmlData;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author annik
     * 
     */
    @XmlRootElement(name = "response")
    //@XmlType( propOrder = { "category", "action", "code", "message"})
    public class OnicGreetingResponse
    {
        private OnicEnumCategory category;
        private OnicEnumAction   action;
        private Integer          code;
        private String           message;
    
    //    private GreetingResData  resData;
        private ResData resData;
    
        //
        @XmlTransient
        private Logger           LOG = LoggerFactory.getLogger(getClass());
    
        /**
         * Getter.
         * 
         * @return the category
         */
        public OnicEnumCategory getCategory() {
            return category;
        }
    
        /**
         * Setter.
         * 
         * @param category
         *            the category to set
         */
        public void setCategoryEnum(OnicEnumCategory category) {
            this.category = category;
        }
    
        @XmlElement
        public void setCategory(String category) {
            try {
                this.category = OnicEnumCategory.getEnum(category);
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                LOG.error(e.getMessage());
            }
        }
    
        /**
         * Getter.
         * 
         * @return the action
         */
        public OnicEnumAction getAction() {
            return action;
        }
    
        /**
         * Setter.
         * 
         * @param action
         *            the action to set
         */
        public void setActionEnum(OnicEnumAction action) {
            this.action = action;
        }
        @XmlElement
        public void setAction(String action) {
            try {
                this.action = OnicEnumAction.getEnum(action);
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                LOG.error(e.getMessage());
            }
        }
    
        /**
         * Getter.
         * 
         * @return the code
         */
        @XmlElement
        public Integer getCode() {
            return code;
        }
    
        /**
         * Setter.
         * 
         * @param code
         *            the code to set
         */
        public void setCode(Integer code) {
            this.code = code;
        }
    
        /**
         * Getter.
         * 
         * @return the message
         */
        @XmlElements(value={@XmlElement})
        public String getMessage() {
            return message;
        }
    
        /**
         * Setter.
         * 
         * @param message
         *            the message to set
         */
        public void setMessage(String message) {
            this.message = message;
        }
    
        /** Getter.
         * @return the resData
         */
        public ResData getResData() {
            return resData;
        }
    
        /** Setter.
         * @param resData the resData to set
         */
        @XmlElement
        public void setResData(ResData resData) {
            this.resData = resData;
        }
    
        @Override
        public String toString() {
            return "category=" + category + ", action=" + action + ", code=" + code + ", msg=" + message
                    + ", resData:" + resData.toString();
        }
    }
    

    and vu-alja : I got that !

    And as you can see below it works to another way : http://i.stack.imgur.com/35nzb.png

    0 讨论(0)
提交回复
热议问题