JAXB @XmlAttribute @XmlValue真实的例子

我是JAXB的新手,在从XML转换为Java类实例时遇到了麻烦。

我有以下XML:

  client Greeting 1000 Your Connection with API Server is Successful  2009-02-16 06:22:21   

我开发了以下Java代码:

 /** * Copyright 2013. ABN Software. All Rights reserved.
* Author ...... Andre
* Created ..... 14.03.2013
*
*/ 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.
* Author ...... Andre
* Created ..... 14.03.2013
*
*/ 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://sofzh.miximages.com/java/qCCIM.png

请帮帮我。

我也不明白万一我会有很多不同

 .. 

我能做些什么容易而且简单?
我是说这种情况:

  2004-12-17 2009-01-02 7fe11fd9d97ee40bdf57e561427c0a6 dns1.onlinenic.net dns2.onlinenic.net 123456 123456 BJ mokcup 123456 123456 123456 +86.5925391800 +86.5925391800 asdfasdf@sadf.com .... 

谢谢Blaise Doughan。 但经过挖掘超过10个主题后,我认为我必须以相反的方式开始。

我创建了一个MARSHALLING我的数据(对象)的新测试。 实际上,我认为我使用了TDD(测试驱动开发)方式。 所以,我用测试数据填充了我的对象并应用了编组(从DATA创建了XML)并看到了我得到的。 数据不正确。 我也查看了其他主题(感谢这个Java / JAXB:根据属性将Xmash渲染到特定的子类 )并更正我的数据结构

记得我想得到

   1000 Big message  2013.03.14   

现在我的数据是:

 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 data; /** * Getter. * * @return the data */ public List getData() { return data; } /** * Setter. * * @param data * the data to set */ public void setData(List 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