首页 > 解决方案 > 如何告诉 JAXB,该元素是 Root 的 Child?

问题描述

我有一些 XML 格式的测试数据,我想映射到 POJO。

<Root>
   <Child1>
      <Data>
      </Data>
   </Child1>
   <Child2>
      <Data>
      </Data>
   </Child2>
</Root>

Child1 是第一个 Object,而 Child2 是第二个。

JAXBContext context = JAXBContext.newInstance(classesToLoad);
Unmarshaller um = context.createUnmarshaller();
Object obj = (Object) um.unmarshal(data);

在这种情况下,对象只是一个占位符

@Getter
@Setter
@XmlRootElement(name = "TestData")
public class Child1 {

    @XmlElement(name = "ID")
    private String ID;
}

.

这是我现在正在使用的代码,但我得到了这个异常:

javax.xml.bind.UnmarshalException:意外元素(URI:“”,lokal:“TestData”)。预期的元素是: Child1

标签: javaxmlunmarshalling

解决方案


移动注释

@XmlRootElement(name = "TestData")

到您的 Root 类并将其更改为

@XmlRootElement(name = "Root")

我相信你会需要

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Child1")

在 Child1 类中。

再试一次。

异常告诉您的是,它需要一个名称为 TestData 且名称空间为 "" 的元素(您现在可以忽略名称空间,因为它是空白的,但需要一两分钟来查看,因为它在使用时可能会绊倒您第一次使用 XML),这是因为您将根元素定义为 TestData。

此外,您提供的数据示例似乎与您设计的类不对应。

<Child1>
    <Data>
    </Data>
</Child1>

public class Child1 {

    @XmlElement(name = "ID")
    private String ID;
}

为了简洁起见,我不知道您是否为了简洁而替换了随附的数据,但是您的 Java 对象将更类似于此 XML。

<Child1>
   <ID>[String ID value]</ID>
</Child1>

推荐阅读