サードパーティのシステムと統合しようとしていますが、オブジェクトのタイプによっては、返されるXMLドキュメントのルート要素が変化します。マーシャリング/アンマーシャリングにJAXBライブラリを使用しています。
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>
私はそれらを汎用オブジェクトにマッピングするさまざまな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 Map<String, String> otherElements;
}
そして、不明な値をマップに変換するためのアダプター:
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;
}
}
これにより、フィールドにIDと携帯電話番号が表示され、残りは不明なものが地図に表示されます。
これは、上記の例のようにルート要素がROWに固定されている場合に機能します。
ルート要素が各XML で異なるようにこれを機能させるにはどうすればよいですか?非整列化中にルート要素にとらわれない方法はありますか?
1
私はすべての使用を超えて一般的だと思います。ここでは契約はありません。何でも返品できます。ユーザーに推測させます。私は、返されるタイプごとに明示的なメソッドを持つより優れたAPIを作成するか、この要件を削除します。
—
duffymo
少なくとも、すべての可能なルート要素を知っていますか?
—
Harshal Khachane
@HarshalKhachaneはい、私はセットを知っています!
—
Siddharth Trikha
セットが長すぎない場合は、継承を使用して、すべてのXMLElementを親クラスに移動し、すべてのルートに子クラスを作成できます。
—
Harshal Khachane