如何让JAXB中的unmarshaller忽略XML根元素名称?

时间:2012-12-11 19:31:21

标签: java xml jaxb fxg

我正在阅读一些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 个答案:

答案 0 :(得分:7)

默认情况下,JAXB(JSR-222)实现将根据根元素确定要解组的类。这与通过@XmlRootElement@XmlElementDecl注释提供的元数据相匹配。

或者你是一个采用类参数的unmarshal方法。这告诉JAXB你希望解组什么类。 unmarshal的结果将是JAXBElement的一个实例,除了Java对象之外,它还包含根元素信息,以备不时之需。

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