JAXB unmarshal在运行时选择根名称

时间:2015-01-07 08:36:50

标签: java xml jaxb unmarshalling

我有几个带有备用根元素的xml文件:

<ulti86>, 
<ulti75>, 
<ulti99>....

否则,xml结构是相同的。

我想在同一个pojo中解组这些文件。

我看到可以在运行时使用

更改编组操作中元素的名称
JAXBElement and Qname (like : JAXBElement<Customer> jaxbElement = 
new JAXBElement<Customer>(new QName(null, "customer"), Customer.class, customer);)

是否可以在解组时指示运行时根元素的名称?

Ulti课程:

@XmlRootElement
public class Ulti {
....
}

unmarshal方法:

JAXBContext jaxbContext = JAXBContext.newInstance(Ulti.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
File xmlFile = new File(getFullFileName());
Ulti icc = (Ulti) unmarshaller.unmarshal(xmlFile);

2 个答案:

答案 0 :(得分:2)

使用JAXB类根元素的名称应该是无关紧要的,您可以更改它,并且仍然可以成功解组。

示例输入xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<point>
    <x>1</x>
    <y>2</y>
</point>

解组代码:

Point p = JAXB.unmarshal(new File("p.xml"), Point.class);
System.out.println(p); // Output: java.awt.Point[x=1,y=2]

现在,如果您将根元素更改为例如"<p2oint>"并再次运行它,则会得到相同的结果而不会出现任何错误。

答案 1 :(得分:2)

您可以使用unmarshal上的Unmarshaller方法之一获取Class参数来获取您要查找的行为。通过告诉JAXB你解组的Class是什么类型的,它不需要通过根元素来解决一个问题。

StreamSource xmlSource = new StreamSource(getFullFileName());
JAXBElement<Ulti> jaxbElement = unmarshaller.unmarshal(xmlSource, Ulti.class);
Ulti icc = jaxbElement.getValue();

注意:

使用Unmarshaller.unmarshal(Source, Class)优于JAXB.unmarshal(File, Class)的优势在于,只需创建一个可以重复使用的JAXBContext,即可只处理一次元数据。