Ich versuche, mich in ein System eines Drittanbieters zu integrieren. Je nach Objekttyp ändert sich das Stammelement des zurückgegebenen XML-Dokuments. Ich verwende die JAXB-Bibliothek für Marshalling / Unmarshalling.
Root1:
<?xml version="1.0" encoding="UTF-8"?>
<root1 id='1'>
<MOBILE>9831138683</MOBILE>
<A>1</A>
<B>2</B>
</root1>
Root2:
<?xml version="1.0" encoding="UTF-8"?>
<root2 id='3'>
<MOBILE>9831138683</MOBILE>
<specific-attr1>1</specific-attr1>
<specific-attr2>2</specific-attr2>
</root2>
Ich verwende all die verschiedenen XML-Dateien, die sie einem generischen Objekt zuordnen :
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ROW")
public class Row {
@XmlAttribute
private int id;
@XmlElement(name = "MOBILE")
private int mobileNo;
@XmlMixed
@XmlAnyElement
@XmlJavaTypeAdapter(MyMapAdapter.class)
private Map<String, String> otherElements;
}
Und der Adapter zum Verwandeln der unbekannten Werte in eine Karte :
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.parsers.DocumentBuilderFactory;
import java.util.HashMap;
import java.util.Map;
public class MyMapAdapter extends XmlAdapter<Element, Map<String, String>> {
private Map<String, String> hashMap = new HashMap<>();
@Override
public Element marshal(Map<String, String> map) throws Exception {
// expensive, but keeps the example simpler
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("dynamic-elements");
for(Map.Entry<String, String> entry : map.entrySet()) {
Element element = document.createElement(entry.getKey());
element.setTextContent(entry.getValue());
root.appendChild(element);
}
return root;
}
@Override
public Map<String, String> unmarshal(Element element) {
String tagName = element.getTagName();
String elementValue = element.getChildNodes().item(0).getNodeValue();
hashMap.put(tagName, elementValue);
return hashMap;
}
}
Dadurch werden ID und Handynummer in die Felder und der Rest, das Unbekannte, in eine Karte eingefügt .
Dies funktioniert, wenn das Stammelement wie im obigen Beispiel auf ROW festgelegt ist.
Wie kann dies so funktionieren, dass das Stammelement in jedem XML unterschiedlich ist? Ein Weg, um beim Unmarshalling vielleicht nur agnostisch gegenüber Root-Elementen zu sein?