2

我从一些我希望能够从 XML 解组的 Java 类开始——我正在确定模式。我想使用类似于以下的 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;
}

我想将 <foo xmlns="http://proprietary.foo"> 元素及其后代传递给已编译的工厂类,其工作方式如下:

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

似乎我需要为 ProprietaryFoo 创建一个 DomHandler 但我不太明白(我得到的是“com.xyz.ProprietaryFooImpl 或其任何超类在这种情况下都是已知的。”)我也是对 XmlJavaTypeAdapter 感兴趣我不知道如何将 ValueType 作为元素接收。

4

1 回答 1

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 处理得很好。

于 2011-04-01T20:46:45.753 回答