Es gibt eine Klasse namens Parent
, die aus einer xsd-Datei generiert wird und eine vollständige JABX mit Anmerkungen enthält List.
Diese Klasse kann nicht geändert werden. Des Weiteren gibt es eine Child extends Parent
Klasse, die ein XmlAdapter
verwenden möchten, um die List
zu einem HashMap
zu konvertieren. Das Feld HashMap
hat (könnte) denselben Namen haben und demselben xsd-Element zugeordnet sein.JAXB Wiederverwendung Annotation von Elternklasse und Zugriffsvoreinstellungsfeld
Kann eingestellt JAXB ein Feld mit dem gleichen Namen mehrmals? Versucht JAXB, die bereits gefüllte List
der Elternklasse als Eingabe für die XmlAdapter
in der Kindklasse zu verwenden? Ich nehme an, das wird nicht so funktionieren, wie ich es mir erhofft habe.
Wie kann diese Aufgabe ordentlich zu tun?
EDIT: Meine eigentliche Frage ist wirklich, wie JAXB automatisch generierte Bohnen, die nicht bearbeitet werden sollten und noch in der Lage sein, eine Hashmaps verwenden.
Hier ist mein Code, der nicht funktioniert. Die Karte bleibt null. Sry für die schlechte Code-Formatierung.
public class Adapter extends XmlAdapter<LinkedList<A>,HashMap<String,A>> {
@Override
public LinkedList<A> marshal(HashMap<String, A> v) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public HashMap<String, A> unmarshal(LinkedList<A> v) throws Exception {
HashMap<String, A> map = new HashMap<String, A>();
for(A a:v) {
map.put(a.k, a);
}
return map;
}
}
@XmlRootElement
public class Child extends Parent {
@XmlElement(name="a")
@XmlJavaTypeAdapter(Adapter.class)
HashMap<String,A> map;
}
@XmlRootElement
public class Parent {
@XmlElement(name="a")
LinkedList<A> values = new LinkedList<A>();
}
public class XmlTest {
public static void main(String[] args) throws ParserConfigurationException, JAXBException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(new File("test.xml"));
JAXBContext jc = JAXBContext.newInstance(Child.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Child instance = unmarshaller.unmarshal(doc,Child.class).getValue();
}
}
Hier ist die Klasse A:
public class A {
@XmlAttribute
String v;
@XmlAttribute
String k;
}
Hier die test.xml
:
<root>
<a v="1" k="a"/>
<a v="2" k="b"/>
</root>
(1) Sie können kein 'a'-Element zwei Eigenschaften in Java zuordnen. Wie diese zwei verschiedenen Eigenschaften zurück zu XML zugeordnet werden (2) Ich vermisse das Mapping für die Klasse 'A' (3) Kannst du deine' test.xml' veröffentlichen? –
@dma_k danke siehe bearbeiten. Ich denke, dass die Verwendung eines Namens für mehrere Felder ein Problem sein kann, aber vielleicht gibt es eine kluge Möglichkeit JAXB zu sagen, die höchste Klasse in der Hierarchie zu verwenden. Ich benutze jetzt die 'afterUnmarshall'-Methode, um eine Hashmaps aufzubauen, aber die Adapter-Approach wäre schöner. Aber es scheint unmöglich zu sein? –