如何告诉JAXB,该元素是“根之子”?

时间:2019-05-02 09:12:23

标签: java xml unmarshalling

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

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

Child1是第一个对象,Child2是第二个对象。

JAXBContext context = JAXBContext.newInstance(classesToLoad);
Unmarshaller um = context.createUnmarshaller();
Object obj = (Object) um.unmarshal(data);
在这种情况下,

Object 只是一个占位符

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

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

这是我现在正在使用的代码,但出现此异常:

  

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

1 个答案:

答案 0 :(得分:1)

移动注释

@XmlRootElement(name = "TestData")

转到您的Root类,并将其更改为

@XmlRootElement(name = "Root")

我相信您需要

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

在Child1类中。

再试一次。

该异常告诉您的是,它期望使用名称空间为“”的名称为TestData的元素(您可以忽略名称空间,因为它为空,但是花一两分钟的时间来看一下this,因为它是会在您第一次使用XML时使您失望),这是因为您将根元素定义为TestData。

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

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

public class Child1 {

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

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

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