我有几个带有备用根元素的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);
答案 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
,即可只处理一次元数据。