有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

有可能在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='Hello World'和cdf='Hello'填充消息对象。也就是abc字段的子字符串

我尝试对cdf字段使用XMLJavaAdapter,但在Adapter类的unmarshal方法中,我只能获得字符串dummy作为ValueType,即cdf字段的值

这在JAXB中可能吗


共 (1) 个答案

  1. # 1 楼答案

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

    @XmlRootElement(name="message")
    class Message{
    
         public String abc;
    
         @XmlTransient
         public String cdf;
    }
    

    然后,在解组完成后,可以利用解组事件填充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

    对演示代码的更正

    在创建JAXBContext时,需要包括Message类:

     JAXBContext jc = JAXBContext.newInstance(Message.class);
    

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