JAXB / MOXy: Как частично разобрать, передавая потомков данного узла в закрытый / проприетарный класс? - PullRequest
2 голосов
/ 01 апреля 2011

Я начинаю с некоторых классов 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;
}

Я хотел бы передать

1 Ответ

2 голосов
/ 02 апреля 2011

Завершено использованием 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это хорошо.

...