JAXB/MOXy:如何部分解组,将给定节点的后代传递给封闭/专有类?
我从一些Java类开始,我希望这些Java类能够从XML中解压出来——我将一边确定模式。我希望使用类似于以下内容的XML:JAXB/MOXy:如何部分解组,将给定节点的后代传递给封闭/专有类?,jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,我从一些Java类开始,我希望这些Java类能够从XML中解压出来——我将一边确定模式。我希望使用类似于以下内容的XML: <Person fname="John" lname="Doe"> <bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio> </Person> public class P
<Person fname="John" lname="Doe">
<bio><foo xmlns="http://proprietary.foo">Blah <bar>blah</bar> blah</foo></bio>
</Person>
public class Person {
@XmlAttribute
public String fname;
@XmlAttribute
public String lname;
@XmlElement
public ProprietaryFoo bio;
}
我想将元素及其后代传递给编译的工厂类,其工作方式如下:
FooFactory.getFooFromDomNode(myFooElement)//返回私有propertaryFooImpl作为公共propertaryFoo接口的实例
似乎我需要为ProprietaryFoo创建一个DomHandler,但我还没有完全弄明白(我得到的是“com.xyz.ProprietaryFooImpl,它的任何超类在此上下文中都不为人所知。”)我还对XmlJavaTypeAdapter感兴趣,我不知道如何将ValueType作为元素接收。最后使用了XmlAdapter和DOMDhandler以及一个简单的包装类
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();
}
}
公共类FooWrapper{
@XmlAnyElement(FooDomHandler.class)
公共财产公司foo foo;
}
公共类FooXmlAdapter扩展了XmlAdapter{
@凌驾
public propertaryFoo unmarshal(FooWrapper w)引发异常{
返回w.foo;
}
@凌驾
公共FooWrapper封送处理程序(ProprietaryFoo f)引发异常{
FooWrapper=newFooWrapper();
fooWrapper.foo=f;
返回包装器;
}
}
/*供应商还提供了一个ProprietaryFooResult类,该类扩展了SAXResult*/
公共类FooDomHandler实现了DomHandler{
@凌驾
公共专有权FooResult createUnmarshaller(ValidationEventHandler ValidationEventHandler){
返回新的propertaryFooResult();
}
@凌驾
公共propertaryFoo getElement(propertaryFooResult r){
返回r.getpropertaryfoo();
}
@凌驾
公共源封送员(ProprietaryFoo f,ValidationEventHandler ValidationEventHandler){
返回f.asSaxSource();
}
}
无论出于何种原因,这对com.sun命名空间中的标准类都不起作用,但MOXy处理得很好