首頁 >Java >java教程 >如何使用 JAXB 將映射編組為「值」XML 結構?

如何使用 JAXB 將映射編組為「值」XML 結構?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-18 02:48:02920瀏覽

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

JAXB:將Map 編組為

JAXB 本身支援將Map 編組為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,限制映射元素包含 xs:string 鍵和值。這確保了清晰的介面契約。

您的方法將產生一個 XSD,指定映射包含未知類型的元素,這違反了良好實踐。

枚舉密鑰解決方案

要執行嚴格的契約,請考慮使用枚舉類型作為映射鍵而不是字符串:
public enum KeyType {
    KEY, KEY2;
}

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

JAXB 將產生一個架構,將映射元素限制為使用預先定義鍵KEY 或KEY2 的元素。

預設結構的簡化

如果您喜歡 更簡單的XML 結構;元素,您可以使用MapAdapter 將Map 轉換為MapElements 陣列:
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 將映射編組為「值」XML 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn