Ich verwende JAX-B (v.2.2.12), um einen Java-Objektbaum zu marshalieren. Eine der Klassen ist CaseObject werden vermarshallten:JAX-B: Elementname dynamisch generieren aus XMLAttribute
public class CaseObject {
...
@XmlAnyElement
@XmlJavaTypeAdapter(ParameterAdapter.class)
protected List <CaseObject> caseObjects;
...
}
Die aktuelle xml represention nach Rangierung:
<caseObject id="1" name="someName" typeId="0">
...
<caseObject id="29" key="someOtherName" typeId="12">
...
</caseObject>
</caseObject>
Das gewünschte Ziel xml represention:
<someName id="1" name="someName" typeId="0">
...
<someOtherNameid="29" key="someOtherName" typeId="12">
...
</someOtherName>
</someName>
ich um gespielt habe durch Erweitern @XmlAdapter unter Verwendung des folgenden Schnipsel (example from a blog):
@Override
public Element marshal(CaseObject caseObject) throws Exception {
if (null == caseObject) {
return null;
}
// 1. Build a JAXBElement
QName rootElement = new QName(caseObject.getName());
Object value = caseObject;
Class<?> type = value.getClass();
JAXBElement jaxbElement = new JAXBElement(rootElement, type, value);
// 2. Marshal the JAXBElement to a DOM element.
Document document = getDocumentBuilder().newDocument();
Marshaller marshaller = getJAXBContext(type).createMarshaller();
// where the snake bites its own tail ...
marshaller.marshal(jaxbElement, document);
Element element = document.getDocumentElement();
return element;
}
Frage ist: Wie instrumentieren JAX-B dynamisch Elementnamen aus einer Eigenschaft (XMLAttribute) während des Marshalling generieren?
Ein möglicher Nachteil bei der Verwendung von XMLAdapters sollte der Vollständigkeit halber erwähnt werden: wenn sie mit XMLAdapters kommentierte beeing es derzeit keine Möglichkeit zu ähneln Änderungen in XSD automatisch XSD von Klassen zu erzeugen. –