Xstream Map <-> XML (2)

황제낙엽 2011.04.29 13:54 조회 수 : 392

site_link1  
site_link2  
site_link3 http://1 
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.mapper.Mapper;

public class XmlToMap {

private String xmlData = null;
private String root = null;

/**
*
*/
public XmlToMap(String xml, String root) {

this.xmlData = xml;
this.root = root;

}

@SuppressWarnings("unchecked")
public Object build() throws Exception {

XStream xStream = new XStream(new DomDriver("UTF-8"));
Mapper mapper = xStream.getMapper();
xStream.alias(root, Map.class);
xStream.registerConverter(new MapConverter(mapper));

Map<String, String> xmlMap = (Map<String, String>) xStream.fromXML(xmlData);

return xmlMap;
}

public static class MapConverter extends AbstractCollectionConverter implements Converter {

public MapConverter(Mapper mapper) {
super(mapper);
}

@SuppressWarnings("rawtypes")
public boolean canConvert(Class type) {
return type.equals(java.util.HashMap.class)
|| type.equals(java.util.Hashtable.class)
|| (type.getName().equals("java.util.LinkedHashMap") 
|| type.getName().equals("sun.font.AttributeMap"));
}

@SuppressWarnings("rawtypes")
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {

AbstractMap map = (AbstractMap) value;
for (Object obj : map.entrySet()) {
Entry ety = (Entry) obj;
writer.startNode(ety.getKey().toString());
writer.setValue(ety.getValue().toString());
writer.endNode();
}

}

@SuppressWarnings( { "unchecked", "rawtypes" })
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext arg1) {

Map elements = new HashMap();
for (; reader.hasMoreChildren(); reader.moveUp()) {

reader.moveDown();

if (reader.hasMoreChildren() == true) {

//재귀호출
elements.put(reader.getNodeName(), unmarshal(reader, arg1));

} else {

String tempValue = reader.getValue();
String tempKey = reader.getNodeName();

if (tempValue != null) {
tempValue = tempValue.trim().replaceAll("n", "");
}

Object gettingValue = elements.get(tempKey);
if (gettingValue != null) {

//가장 하위의 요소들이 중복일경우에는 List 처리를 합니다.
//단 , 상위요소가 중복일경우에는 무시합니다. 하나만 처리됩니다.
// 예
//<abc>
// <record>
//  <ele>1</ele>
//  <ele>2</ele>
// </record>
// <record>
//  <ele>3</ele>
//  <ele>4</ele>
// </record>
//</abc>
//위와 같을경우에 <ele> 요소는 배열처리 되지만 <record>는 나머지는 무시되고 하나만 저장됩니다.

//중복된 요소의 List 처리
if (gettingValue instanceof List) {
((List) gettingValue).add(tempValue);
elements.put(tempKey, gettingValue);
} else if (gettingValue instanceof String) {
List tempList = new ArrayList();
tempList.add(gettingValue);
tempList.add(tempValue);
elements.put(tempKey, tempList);
}

} else {
elements.put(reader.getNodeName(), tempValue);
}

}
}

return elements;
}

}

public static void main(String args[]) {

StringBuilder buffer = new StringBuilder();

buffer.append("<res>      ");
buffer.append(" <param>      ");
buffer.append("  <val1>val1</val1>  ");
buffer.append("  <val2>val2</val2>  ");
buffer.append(" </param>      ");
buffer.append("</res>      ");

XmlToMap test = new XmlToMap(buffer.toString(), "res");
try {
Object oo = test.build();
System.out.println(oo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
번호 제목 글쓴이 날짜 조회 수
50 XpressEngine(XE) 에서 엮인글 스팸 방지법 file 황제낙엽 2017.08.25 633
49 [Hibernate] 페이징 처리 정리 황제낙엽 2007.02.26 534
48 [Hibernate] Hibernate 프레임워크를 이용한 효율적인 개발 전략 황제낙엽 2007.01.30 480
47 XStream 배우기 : 별칭(Alias) 배우기 황제낙엽 2011.04.20 438
46 JSTL과 Velocity를 활용한 UI 레이어 구현 방법 황제낙엽 2007.01.30 428
45 XStream 배우기 : 변환기(Converter) 배우기 황제낙엽 2011.04.20 402
» Map <-> XML (2) 황제낙엽 2011.04.29 392
43 부트스트랩 4 와 5 버전 차이를 알려줘 (from ChatGPT) 황제낙엽 2023.02.24 318
42 Custom XStream Converter 황제낙엽 2011.04.26 310
41 [Hibernate] Hibernate Tutorial 황제낙엽 2012.11.15 280
40 Vanilla JS Datepicker 에서 locales 지정 (한국어로 출력) 황제낙엽 2023.06.19 249
39 [Hibernate] Hibernate 와 Ant 에서 composite id 사용하기 예제 file 황제낙엽 2005.11.29 249
38 검색엔진 루씬 Lucene... Analyzer의 선택 황제낙엽 2007.11.27 212
37 [Hibernate] 하이버네이트 참조문서 버전 3.2 cr3의 최신 업데이트 한글 번역본 file 황제낙엽 2007.07.03 200
36 XE 서버 이전 계획 file 황제낙엽 2018.08.29 189
35 벨로시티에서 loop 작성 황제낙엽 2005.12.13 188
34 Chatbot 용 디자인 템플릿 (ChatGPT) file 황제낙엽 2024.01.28 166
33 XML -> (Map) XML 황제낙엽 2011.04.29 159
32 Bootstrap 5 Gallery Examples & Freebies 황제낙엽 2023.09.26 158
31 Jakarta Lucene (루씬) - 들어가기 황제낙엽 2007.07.30 149