JAXB / MOXy:如何部分解组,将给定节点的后代传递给封闭/专有类?

时间:2011-04-01 17:07:03

标签: jaxb eclipselink moxy

我从一些Java类开始,我希望能够从XML解组 - 我正在确定模式。我想使用类似于以下的XML:

<Person fname="John" lname="Doe">
  <bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio>
</Person>

我希望能够像以下类似地修改我的Java类:

public class Person {
  @XmlAttribute
  public String fname;

  @XmlAttribute
  public String lname;

  @XmlElement
  public ProprietaryFoo bio;
}

我想传递&lt; foo xmlns =“http://proprietary.foo”&gt;元素和它的后代到已编译的工厂类,其工作方式如下:

FooFactory.getFooFromDomNode(myFooElement) // Returns a private ProprietaryFooImpl as an instance of the public ProprietaryFoo Interface

似乎我需要为ProprietaryFoo创建一个DomHandler,但我无法弄明白(我得到的是“com.xyz.ProprietaryFooImpl,它的任何超类都不知道这个上下文。”)I我也对XmlJavaTypeAdapter感兴趣我无法弄清楚如何将ValueType作为元素接收。

1 个答案:

答案 0 :(得分:2)

结束使用XmlAdapter和DomHandler以及简单的Wrapper类。

public class FooWrapper {
    @XmlAnyElement(FooDomHandler.class)
    public ProprietaryFoo foo;
}

public class FooXmlAdapter extends XmlAdapter<FooWrapper, ProprietaryFoo> {
    @Override
    public ProprietaryFoo unmarshal(FooWrapper w) throws Exception {
        return w.foo;
    }

    @Override
    public FooWrapper marshal(ProprietaryFoo f) throws Exception {
        FooWrapper fooWrapper = new FooWrapper();
        fooWrapper.foo = f;
        return fooWrapper;
    }
}

/* The vendor also provides a ProprietaryFooResult class that extends SAXResult */
public class FooDomHandler implements DomHandler<ProprietaryFoo, ProprietaryFooResult> {

    @Override
    public ProprietaryFooResult createUnmarshaller(ValidationEventHandler validationEventHandler) {
        return new ProprietaryFooResult();
    }

    @Override
    public ProprietaryFoo getElement(ProprietaryFooResult r) {
        return r.getProprietaryFoo();
    }

    @Override
    public Source marshal(ProprietaryFoo f, ValidationEventHandler validationEventHandler) {
        return f.asSaxSource();
    }
}

无论出于何种原因,这不适用于com.sun命名空间中的标准类,但MOXy可以很好地处理它。