JAXB を使用してマップを「value」XML 構造にマーシャリングする方法

Mary-Kate Olsen
リリース: 2024-11-18 02:48:02
オリジナル
846 人が閲覧しました

How to Marshall a Map into `value` XML Structure with JAXB?

JAXB: マップを value

にマーシャリングしますが、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 xs:string キーと値を含むようにマップ要素を制限する XSD を生成します。これにより、明確なインターフェイス コントラクトが保証されます。

このアプローチでは、マップに未知の型の要素が含まれていることを指定する 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート