簡體   English   中英

JAXB @XmlAttribute @XmlValue實例

[英]JAXB @XmlAttribute @XmlValue real example

我是JAXB的新手,在從XML轉換為Java類實例時遇到了麻煩。

我有以下XML:

<?xml version="1.0"?>
<response>
    <category>client</category>
    <action>Greeting</action>
    <code>1000</code>
    <msg>Your Connection with API Server is Successful</msg>
    <resData>
        <data name="svDate">2009-02-16 06:22:21</data>
    </resData>
</response>

我開發了以下Java代碼:

/**
 * Copyright 2013. ABN Software. All Rights reserved.<br>
 * Author ...... Andre<br>
 * Created ..... 14.03.2013<br>
 * <br>
 */
package net.regmaster.onlinenic.model;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

import net.regmaster.onlinenic.enumtype.OnicEnumAction;
import net.regmaster.onlinenic.enumtype.OnicEnumCategory;
import net.regmaster.onlinenic.model.resdata.GreetingResData;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author annik
 * 
 */
@XmlRootElement(name = "response")
// @XmlType( propOrder = { "category", "action", "code", "message"})
public class OnicGreeting
{
    private OnicEnumCategory category;
    private OnicEnumAction   action;
    private Integer          code;
    private String           message;
    private GreetingResData  resData;
    //
    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
     */
    @XmlElement(name = "msg")
    public String getMessage() {
        return message;
    }

    /**
     * Setter.
     * 
     * @param message
     *            the message to set
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * Getter.
     * 
     * @return the resData
     */
    @XmlElementRef
    public GreetingResData getResData() {
        return resData;
    }

    /**
     * Setter.
     * 
     * @param resData
     *            the resData to set
     */
    public void setResData(GreetingResData resData) {
        this.resData = resData;
    }

    @Override
    public String toString() {
        return "category=" + category + ", action=" + action + ", code=" + code + ", msg=" + message
                + ", resData:" + resData.toString();
    }
}

/**
 * Copyright 2013. ABN Software. All Rights reserved.<br>
 * Author ...... Andre<br>
 * Created ..... 14.03.2013<br>
 * <br>
 */
package net.regmaster.onlinenic.model.resdata;

import java.util.Calendar;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

/**
 * @author annik
 * 
 */
@XmlRootElement(name="resData")
public class GreetingResData extends AbstractResData
{
    String svDate;

    /**
     * Constructor.
     * 
     */
    public GreetingResData() {
        // TODO Auto-generated constructor stub
    }

    /**
     * Getter.
     * 
     * @return the svDate
     */
    @XmlAttribute
    public String getSvDate() {
        return svDate;
    }

    /**
     * Setter.
     * 
     * @param svDate
     *            the svDate to set
     */
    public void setSvDate(String svDate) {
        this.svDate = svDate;
    }
}

這些代碼示例運行但數據錯誤:

http://i.stack.imgur.com/qCCIM.png

請幫我。

我也不明白萬一我會有很多不同

<data ...>..</data> 

我能做些什么容易而且簡單?
我是說這種情況:

<resData>
<data name="crDate">2004-12-17</data>
<data name="exDate">2009-01-02</data>
<data name="password">7fe11fd9d97ee40bdf57e561427c0a6</data>
<data name="dns">dns1.onlinenic.net</data>
<data name="dns">dns2.onlinenic.net</data>
<data name="r_name">123456</data>
<data name="r_org">123456</data>
<data name="r_country">BJ</data>
<data name="r_province">mokcup</data>
<data name="r_city">123456</data>
<data name="r_street">123456</data>
<data name="r_postalcode">123456</data>
<data name="r_voice">+86.5925391800</data>
<data name="r_fax">+86.5925391800</data>
<data name="r_email">asdfasdf@sadf.com</data>
....

謝謝Blaise Doughan。 但在挖了10多個主題后,我決定以相反的方式開始。

我創建了一個MARSHALLING我的數據(對象)的新測試。 實際上,我認為我使用了TDD(測試驅動開發)方式。 所以,我用測試數據填充了我的對象並應用了編組(從DATA創建了XML)並且看到了我的。 數據不正確。 我也查看了其他主題(感謝這個Java / JAXB:根據屬性將Xmama分離到特定的子類 )並更正我的數據結構

記得我想得到

<?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>

現在我的數據是:

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

並且:

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

並且:

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

和vu-alja:我明白了!

正如您在下面看到的那樣,它可以采用另一種方式: http//i.stack.imgur.com/35nzb.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM