如何使JAXB中的Unmarshaller忽略XML根元素名称?

5

我正在阅读一些XML数据(如果您熟悉的话,是FXG文件)。

数据的一部分具有不同的标签名称:

<varying_name1 scaleX="1.0046692" x="177.4" y="74.2"/>
<varying_name2  scaleX="1.0031128" x="171.9" y="118.9"/>    

我创建了一个名为Transforms的类来表示不同标签名称段内的数据。在我的JAXB类中,我有:

@XmlAnyElement(lax=true)    
@XmlJavaTypeAdapter(TransformAdapter.class)    
protected List<Transform> transforms;

在我的适配器中,我尝试对数据进行解组:

JAXBContext context = JAXBContext.newInstance(Transform.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Transform result = (Transform) unmarshaller.unmarshal(v);

然而,我的代码在这里抛出异常,因为我的元素根名称是不固定的。它不是一个常量。我会得到:
unexpected element (uri:"http://ns.adobe.com/fxg/2008", local:"m6_mc"). Expected elements are (none)

我该如何使它仅仅将我的数据解析为根元素具有其预期名称的方式?
1个回答

7
默认情况下,JAXB(JSR-222)实现将基于根元素确定要解组的类。 这与通过 @XmlRootElement@XmlElementDecl 注释提供的元数据相匹配。
或者,您可以使用带有类参数的解组方法之一。这告诉JAXB您希望解组到哪个类。解组的结果将是一个JAXBElement实例,除了包含Java对象外,还将包含根元素信息(如果需要)。
JAXBContext context = JAXBContext.newInstance(Transform.class); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
Transform result = unmarshaller.unmarshal(v, Transform.class).getValue();

1
我不明白为什么第二次提供类参数会告诉它忽略根元素,但是这确实有效!我应该更仔细地复制我下载的示例。 - Joe
1
@Joe - 我扩展了我的答案,希望这有助于澄清事情。 - bdoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接