Heim >Java >javaLernprogramm >Wie kann ich eine Karte mit JAXB in „Wert'-Elemente marsallieren?

Wie kann ich eine Karte mit JAXB in „Wert'-Elemente marsallieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-13 04:25:02344Durchsuche

How to Marshal a Map into `value` Elements with JAXB?

Marshalling-Map in value mit JAXB

Problem

Karten werden üblicherweise in XML-Strukturen gemarshallt wie:

<map>
  <entry>
    <key>KEY</key>
    <value>VALUE</value>
  </entry>
  <entry>
    <key>KEY2</key>
    <value>VALUE2</value>
  </entry>
  ...
</map>

Manchmal ist es jedoch wünschenswert, XML zu generieren, bei dem der Schlüssel zum Elementnamen wird und der Wert wird zu seinem Inhalt:

<map>
  <KEY>VALUE</KEY>
  <KEY2>VALUE2</KEY2>
 ...
</map>

Lösung

Option 1: Dynamisch benannte XML-Elemente

Die Verwendung dynamischer Attributnamen wird nicht empfohlen, da sie gegen die Prinzipien des XML-Schemas und des Schnittstellenvertrags verstößt.

Option 2: Aufgezählter Schlüsseltyp

Um einen strengen Schnittstellenvertrag aufrechtzuerhalten, verwenden Sie einen Aufzählungsschlüsseltyp für Karte:

public enum KeyType {
    KEY,
    KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType, String> mapProperty;

Option 3: Vereinfachtes Marshalling

Um die Standard-Marshalling-Struktur in

class MapElements {
    @XmlAttribute
    public String key;
    @XmlAttribute
    public String value;
    
    // Required by JAXB
    private MapElements() {}
    
    public MapElements(String key, String value) {
        this.key = key;
        this.value = value;
    }
}

class MapAdapter extends XmlAdapter> {
    @Override
    public MapElements[] marshal(Map arg0) {
        MapElements[] mapElements = new MapElements[arg0.size()];
        int i = 0;
        for (Entry entry : arg0.entrySet()) {
            mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
        }
        return mapElements;
    }
    
    @Override
    public Map unmarshal(MapElements[] arg0) {
        Map r = new TreeMap<>();
        for (MapElements mapelement : arg0) {
            r.put(mapelement.key, mapelement.value);
        }
        return r;
    }
}

Das obige ist der detaillierte Inhalt vonWie kann ich eine Karte mit JAXB in „Wert'-Elemente marsallieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn