>Java >java지도 시간 >JAXB를 사용하여 맵을 '값' XML 구조로 마샬링하는 방법은 무엇입니까?

JAXB를 사용하여 맵을 '값' XML 구조로 마샬링하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-18 02:48:02915검색

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

JAXB: Map을 value

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을 생성하는 것은 일반적으로 권장되지 않습니다. XSD(XML 스키마)는 인터페이스 계약을 정의합니다. JAXB는 코드에서 XSD를 생성할 수 있으므로 XSD의 사전 정의된 구조에 따라 교환되는 데이터를 제한할 수 있습니다.

기본적인 경우 Map xs:string 키와 값을 포함하도록 맵 요소를 제한하는 XSD를 생성합니다. 이렇게 하면 명확한 인터페이스 계약이 보장됩니다.

귀하의 접근 방식에서는 지도에 알 수 없는 유형의 요소가 포함되어 있음을 지정하는 XSD가 생성되며 이는 모범 사례에 위배됩니다.

Enum Key Solution

엄격한 계약을 시행하려면 맵 키 대신 열거형을 사용하는 것이 좋습니다. 문자열:

public enum KeyType {
    KEY, KEY2;
}

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

JAXB는 사전 정의된 키 KEY 또는 KEY2를 사용하여 맵 요소를 요소로 제한하는 스키마를 생성합니다.

기본 구조 단순화

의 간단한 XML 구조를 선호하는 경우 요소의 경우, 지도를 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를 사용하여 맵을 '값' XML 구조로 마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.