我从一些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作为元素接收。
答案 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可以很好地处理它。