【问题标题】:How do you get the unmarshaller in JAXB to ignore the XML root element name?如何让 JAXB 中的解组器忽略 XML 根元素名称?
【发布时间】:2012-12-11 19:31:20
【问题描述】:

我正在阅读一些 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)

我怎样才能让它解组我的数据,就好像根元素具有它预期的名称一样?

【问题讨论】:

    标签: java xml jaxb fxg


    【解决方案1】:

    默认情况下,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();
    

    【讨论】:

    • 我不明白为什么第二次提供 class 参数会告诉它忽略根元素,但是,这是有效的!我应该复制你下载的更仔细的例子。
    • @Joe - 我已经扩展了我的答案,希望这有助于澄清事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2010-09-21
    • 2012-06-23
    相关资源
    最近更新 更多