如何将单个标记映射到JAXB中的多个字段

时间:2014-01-20 17:59:59

标签: java jaxb unmarshalling jaxb2

是否有可能在JAXB

中获得以下内容
 msg.txt

<Message> 
 <abc>Hello World</abc>
 <cdf>Dummy</cdf>
</Message>

  @XmlRootElement(name="message")
  class Message{

     public String abc;
     public String cdf;
   }

   class Test{
      public static void main(String args[]){
         JAXBContext jc = JAXBContext.newInstance();
         Unmarshaller u = jc.createUnmarshaller();
         Message m = (Message) u.unmarshal(new File("C:/msg.txt"));
       }
   }

现在,我希望将消息对象填充为abc =&#39; Hello World&#39;和cdf =&#39;你好&#39;。就是abc字段的子字符串。

我尝试将XMLJavaAdapter用于cdf字段,但在Adapter类的unmarshal方法中,我只能将字符串虚拟为ValueType,即cdf字段的值。

这可以在JAXB中实现吗?

2 个答案:

答案 0 :(得分:1)

您可以映射abc,然后将cdf标记为@XmlTransient(以防止它作为unmarshal的一部分进行填充。

@XmlRootElement(name="message")
class Message{

     public String abc;

     @XmlTransient
     public String cdf;
}

然后,您可以在解组完成后利用unmarshal事件填充cdf字段。以下是执行此操作的两种不同方法的链接:

  1. http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Unmarshaller.Listener.html
  2. http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Unmarshaller.html#unmarshalEventCallback

  3. 对演示代码的更正

    在创建Message

    时,您需要包含JAXBContext课程
     JAXBContext jc = JAXBContext.newInstance(Message.class);
    

    此外,您需要确保在@XmlRootElement注释中指定的名称与XML文档中的根元素名称相匹配。目前,您使用的案例不匹配。

答案 1 :(得分:0)

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Message{

     private String abc;
     private String cdf;

     public Message(){}

     public void setAbc(String abc){
        this.abc = abc;
        this.cdf = /*substring of abc*/ ;
     }

     public String getAbc(){
        return abc;
     }

     public void setCdf(String cdf){
        //
     }

     public void getCdf(){
        return cdf;
     }
}