Jaxb解组要映射的xml序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jaxb解组要映射的xml序列相关的知识,希望对你有一定的参考价值。

我有两个类FoosFoo,它们应该是可序列化的/可从XML反序列化的:

@XmlRootElement(name = "foos")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Foos", propOrder = { "foo" })
public class Foos {

    protected Map<Foo, Foo> foo;

    public Map<Foo, Foo> getFooMap() {
        if (foo == null) {
            foo = new HashMap<Foo, Foo>();
        }
        return this.foo;
    }

    @XmlElements(value = { @XmlElement })
    public Collection<Foo> getFoo() {
        return getFooMap().values();
    }

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = { "name" })
public class Foo {

    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }

}

出于算法原因,我不能使用List<Foo>但需要Map<Foo, Foo>。每个Foo都应该作为关键和价值放入Map

Foos对象编组为XML是有效的,因为我有getFoo getter,但是从XML解组却没有。这可能是因为unmarshaller不知道如何将Foo对象的xml序列转换为哈希映射。

我怎么能告诉unmarshaller?

我想我需要一个像这样的方法(伪代码):

public void fillMap(XMLSequence<Foo> sequence) {
    for (Foo foo : sequence)
        getFooMap().put(foo, foo);
}

然后它可能还需要一些xml注释。

任何提示都表示赞赏!

答案

我发现了一种使用两个字段的方法:

@XmlRootElement(name = "foos")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Foos", propOrder = { "fooList", "foo" })
public class Foos {

    @XmlElement(name="foo")
    protected List<Foo> fooList;

    protected Map<Foo, Foo> foo;

    public Map<Foo, Foo> getFooMap() {
        if (foo == null) {
            foo = new HashMap<Foo, Foo>();
            if (fooList != null)
                for (Foo f : fooList)
                    foo.put(f,  f);
        }
        return this.foo;
    }

    @XmlElement
    public Collection<Foo> getFoo() {
        return getFooMap().values();
    }

}
  • 在解组期间,fooList充满了来自<foo>...</foo> xml元素的数据。
  • 当第一次调用getFooMap时,它会填充fooList的内容(通过将相同的对象作为键和值)。
  • 在编组期间,调用方法getFoo将返回foo映射的值。

以上是关于Jaxb解组要映射的xml序列的主要内容,如果未能解决你的问题,请参考以下文章

使用 DTD 文件导致的 JAXB 解组 XML 时出错

如何调试 JAXB 解组?

使用 JAXB 解组多次出现的 XML 元素

Java/JAXB:根据属性将 Xml 解组为特定子类

JAXB:如何在解组 XML 文档期间忽略命名空间?

JAXB 继承,解组到编组类的子类