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

标签 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 = 'Hello World' 和 cdf = 'Hello' 填充 Message 对象。也就是说,abc 字段的子字符串。

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

这在 JAXB 中可行吗?

最佳答案

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

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

     public String abc;

     @XmlTransient
     public String cdf;
}

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

  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 文档中的根元素名称相匹配。目前,您使用的大小写不匹配。

关于java - 如何将单个标记映射到 JAXB 中的多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240994/

相关文章:

jvm - 可以将 GNU gij 视为 Java 虚拟机吗?

java - 将 Map<String,String> 转换为 Map<Long,Long>

java - JPA 延迟加载

golang 将 map[string]interface{} 解码为包含元数组的结构

java - 更改 netbeans 中的 list (Trusted-Library=true 属性)

java - 无法使用 JAXB 读取 XML 文件

web-services - "prefix xsd is not bound to a namespace"迁移到 Java 8 后使用 JAXB 取消编码 SOAPFault

java - JAXB:如何使 EntityHolder 处理 JSON 请求

go - 有没有办法根据内容动态解码 json?

arrays - 将 json 数组解码为 go struct(数组位于 JSON 字符串的中间