如何在jaxb中编写我无法控制的对象?

时间:2012-02-27 19:16:35

标签: java xml jaxb

我正试图找到一种方法来编组我无法访问的类。我正在努力实现这样的目标:

@XmlRootElement(name="bar")
class Bar {
  @XmlAttribute
  private Foo foo;

  @XmlAttribute
  private String baz;
}

应该产生这样的xml文件:

<bar baz="stuff" foo="otherstuff"/>

这可能吗?我试图摆弄@XmlJavaTypeAdapter没有成功。

2 个答案:

答案 0 :(得分:1)

如果您无权访问用于生成XML文件的类,但您可以访问基于/用于生成这些类的模式,那么您应该能够使用xjc重新生成这些类。模式定义(xsd)文件。

答案 1 :(得分:1)

你使用XmlJavaTypeAdapter正确,但我怀疑foo需要是一个XmlElement而不是一个XmlAttribute:

@XmlRootElement(name="bar")
public class Bar {

  @XmlElement
  @XmlJavaTypeAdapter(FooAdapter.class)
  private Foo foo;

  @XmlAttribute
  private String baz;

}

FooAdapter可以像下面这样简单,但是如果你使代理对象代表Foo并编组而不是Object [],输出会更漂亮。

class FooAdapter extends XmlAdapter<Object[], Foo> {

    @Override
    public Object[] marshal(Foo v) throws Exception {
        return new Object[]{ v.x, v.y, v.z };
    }

    @Override
    public Foo unmarshal(Object[] v) throws Exception {
        Foo foo = new Foo();
        foo.x = (String) v[0];
        foo.y = (Integer) v[1];
        foo.z = (Double) v[2];
        return foo;
    }

}