JAXB: マップを
にマーシャリングしますが、JAXB は次のような XML 構造にマップをマーシャリングすることをネイティブにサポートしています。
<map> <entry> <key> KEY </key> <value> VALUE </value> </entry> <entry> <key> KEY2 </key> <value> VALUE2 </value> </entry> ... </map>
キーが要素名で値がその内容である XML 構造が必要な場合があります:
<map> <key> VALUE </key> <key2> VALUE2 </key2> ... </map>
カスタム XML 構造に対する推奨事項
動的要素名を使用して XML を生成することは、通常は推奨されません。 XML スキーマ (XSD) はインターフェイス コントラクトを定義します。 JAXB はコードから XSD を生成できるため、XSD 内の事前定義された構造に従って交換データを制限できます。
デフォルトの場合、Map
このアプローチでは、マップに未知の型の要素が含まれていることを指定する XSD が生成されますが、これはグッド プラクティスに違反します。
Enum Key Solution
厳密なコントラクトを強制するには、マップ キーとして String の代わりに列挙型を使用することを検討してください。
public enum KeyType { KEY, KEY2; } @XmlJavaTypeAdapter(MapAdapter.class) Map<KeyType, String> mapProperty;
JAXB は、事前定義されたキー KEY またはkey2。
デフォルト構造の簡素化
&lt; item&gt;要素を使用するには、Map を MapElements の配列に変換する MapAdapter を使用できます:
class MapElements { @XmlAttribute public String key; @XmlAttribute public String value; } class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> { public MapElements[] marshal(Map<String, String> arg0) { MapElements[] mapElements = new MapElements[arg0.size()]; int i = 0; for (var entry : arg0.entrySet()) mapElements[i++] = new MapElements(entry.getKey(), entry.getValue()); return mapElements; } public Map<String, String> unmarshal(MapElements[] arg0) { Map<String, String> r = new TreeMap<>(); for (MapElements mapelement : arg0) r.put(mapelement.key, mapelement.value); return r; } }
以上がJAXB を使用してマップを「value」XML 構造にマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。