XML 요소의 시퀀스를 "부모"요소 내에있는 한 HashMap에 비 정렬 화하는 방법을 설명하는 기사가 많이 있습니다. 그러나, 나는 루트 요소 바로 아래에있는 아이들과 함께 작동하지 않습니다!JAXB XML 요소를 HashMap에 unmarshal
옵션 1 - 작품 :
<?xml version="1.0" encoding="UTF-8"?>
<checks>
<checks>
<check key="check1"/>
<check key="check2"/>
...
</checks>
</checks>
옵션 2 -합니까 하지 일 :
<?xml version="1.0" encoding="UTF-8"?>
<checks>
<check key="check1"/>
<check key="check2"/>
...
</checks>
확인 :
package com.foo.conf;
import java.util.Map;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name="checks")
public class Checks {
@XmlJavaTypeAdapter(ChecksAdapter.class)
@XmlElement(name="checks")
public Map<String, Check> checkMap;
}
확인 :
package com.foo.conf;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
public class Check {
@XmlAttribute public String key;
@XmlValue public String description;
public Check() { }
public Check(String key) {
this.key = key;
}
public String getCheckKey() {
return this.key;
}
}
CheckMapType :
package com.foo.conf;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
class CheckMapType {
@XmlElement(name="check")
public List<Check> checkList; // = new ArrayList<Check>();
}
ChecksAdapter :
package com.foo.conf;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
final class ChecksAdapter extends XmlAdapter<CheckMapType, Map<String, Check>> {
@Override
public CheckMapType marshal(Map<String, Check> arg0) throws Exception {
return null;
}
@Override
public Map<String, Check> unmarshal(CheckMapType arg0) throws Exception {
System.out.println("u: " + arg0.checkList.size());
Map<String, Check> map = new HashMap<String, Check>();
for (Check check : arg0.checkList) {
System.out.println(check);
map.put(check.key, check);
}
return map;
}
}
이 내가 클래스를 생성하는 방법 (일부 더미 테스트 라인)입니다/비 정렬 화 호출 :
JAXBContext jc = JAXBContext.newInstance(Checks.class);
Unmarshaller u = jc.createUnmarshaller();
Checks c = (Checks) u.unmarshal(new File("checks.xml"));
System.out.println(c.checkMap.size());
을
어떤 아이디어 옵션 # 2를 작동시키는 방법에 대해? 지도 대신 목록을 사용할 때 작동하지만 지정된 키를 사용하여 개체에 액세스해야하므로 HashMap이 필요합니다 ...
힌트를 많이 보내 주시면 감사하겠습니다.
매우 유용한 설명 주셔서 감사합니다 - 곧 시도해 보겠습니다. – rawberto