我正在尝试与第三方系统集成,并且根据对象的类型,返回的XML文档的根元素会发生变化。我正在使用JAXB库进行编组/解组。
根1:
9831138683 1 2
根2:
9831138683 1 2
我正在使用所有不同的XML将它们映射到通用对象:
@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 MapotherElements; }
还有用于将未知值转换为映射的适配器:
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> { private Map hashMap = new HashMap<>(); @Override public Element marshal(Map map) throws Exception { // expensive, but keeps the example simpler Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element root = document.createElement("dynamic-elements"); for(Map.Entry entry : map.entrySet()) { Element element = document.createElement(entry.getKey()); element.setTextContent(entry.getValue()); root.appendChild(element); } return root; } @Override public Map unmarshal(Element element) { String tagName = element.getTagName(); String elementValue = element.getChildNodes().item(0).getNodeValue(); hashMap.put(tagName, elementValue); return hashMap; } }
这会将ID和手机号码放在字段中,其余的未知字段则放在地图中。
如上例所示,如果根元素固定为ROW,则此方法有效。
如何使这项工作使根元素在每个XML中都不同?一种可能在解组时不了解根元素的方法?