XStream : http://xstream.codehaus.org/download.html


XStream Maven

<dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.4</version>
</dependency> 



Source

 package iwa.xml;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

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.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class MapConverterTest {

 @Test
 public void marshal() throws Exception {
  Map<String,Object> map = new HashMap<String,Object>();
        map.put("name","chris");
        map.put("island","faranga");
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("test", "테스트");
        map2.put("code", "1");
        map.put("tests", map2);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("national", "korea");
        map3.put("dev", "kkk");
        map2.put("devList", map3);

        XStream x = new XStream();
        x.alias("root", Map.class);
        x.registerConverter(new MapEntryConverter());
       
        String xml = x.toXML(map);
        System.out.println(xml);
 }
 
 @Test
 public void unmarshal() throws Exception {
  String xml = "<root><tests><test>테스트</test><code>1</code><devList><dev>kkk</dev><national>korea</national></devList></tests><name>chris</name><island>faranga</island></root>";
  XStream x = new XStream();
  x.autodetectAnnotations(true);
  x.alias("root", HashMap.class);
  x.registerConverter(new MapEntryConverter());
  InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
  HashMap<String, Object> o = (HashMap<String, Object>)(x.fromXML(is));
  System.out.println(o);
 }
 
 public static class MapEntryConverter implements Converter {
      
  public boolean canConvert(Class clazz) {
            return AbstractMap.class.isAssignableFrom(clazz);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
            AbstractMap map = (AbstractMap) value;
            for (Object obj : map.entrySet()) {
                Entry entry = (Entry) obj;
                Object entryValue = entry.getValue();
               
                if(entryValue instanceof Map) {
                 writer.startNode(entry.getKey().toString());
                 marshal(entry.getValue(), writer, context);
                 writer.endNode();
                 continue;
                }
               
                writer.startNode(entry.getKey().toString());
                writer.setValue(entryValue.toString());
                writer.endNode();
            }
        }
        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
         Map<String, Object> map = new HashMap<String, Object>();

            while(reader.hasMoreChildren()) {
                reader.moveDown();
                if(reader.hasMoreChildren()) {
                 Map<String, Object> childMap = new HashMap<String, Object>();
                 map.put(reader.getNodeName(), childMap);
                 unmarshalHierarchical(reader, context, childMap);
                 reader.moveUp();
                 continue;
                }
                map.put(reader.getNodeName(), reader.getValue());
                reader.moveUp();
            }
            return map;
        }
       
        private void unmarshalHierarchical(HierarchicalStreamReader reader, UnmarshallingContext context, Map<String, Object> map) {
            while(reader.hasMoreChildren()) {
                reader.moveDown();
                if(reader.hasMoreChildren()) {
                 Map<String, Object> childMap = new HashMap<String, Object>();
                 map.put(reader.getNodeName(), childMap);
                 unmarshalHierarchical(reader, context, childMap);
                 reader.moveUp();
                 continue;
                }
                map.put(reader.getNodeName(), reader.getValue());
                reader.moveUp();
            }
        }
 }
 
}


================================================================================================================================================
================================================================================================================================================

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

import org.junit.Test;

import test.model.AppModel;

//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:../config/spring/egov/context-*.xml", "classpath:../config/spring/iwa/*.xml"})
public class TestXml {
 
 
 
 @Test
 public void test1() throws Exception {
  JAXBContext context = null;
  List<AppModel> list = null;
  Marshaller marshaller = null;
  
  context = JAXBContext.newInstance(AppModel.class);
  list = new ArrayList<AppModel>();
  AppModel app = new AppModel();
  app.setAppId("1");
  app.setAppNm("앱1");
  list.add(app);
  
  AppModel app2 = new AppModel();
  app2.setAppId("2");
  app2.setAppNm("앱2");
  list.add(app2);
  
  marshaller = context.createMarshaller();
  marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  marshaller.marshal(app2, System.out);
 }
 
 
 @Test
 public void test2() throws Exception {
  Map<String,Object> userData = new HashMap<String,Object>();
  Map<String,String> nameStruct = new HashMap<String,String>();
  nameStruct.put("first", "Joe");
  nameStruct.put("last", "Sixpack");
  userData.put("name", nameStruct);
  userData.put("gender", "MALE");
  userData.put("verified", Boolean.FALSE);
  userData.put("userImage", "Rm9vYmFyIQ==");
  
  JAXBContext jc = JAXBContext.newInstance(Map.class);
  Marshaller marshaller = jc.createMarshaller();
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  marshaller.marshal(userData, System.out);
 }
 
 
 
 
 
 /*
 private String rootNodeName = "itemList";
 
 @SuppressWarnings("unchecked")
 public List<Map<String, Object>> fromXML(String xmlData) throws Exception {
  XStream xStream = new XStream(new DomDriver("UTF-8"));
  Mapper mapper = xStream.getMapper();
  xStream.alias(rootNodeName, List.class);
  xStream.registerConverter(new MapConverter(mapper));
  return (List<Map<String, Object>>) xStream .fromXML(xmlData);
 }
 
 public String toXML(List<Map<String, Object>> mapList) {
  XStream xStream = new XStream(new DomDriver("UTF-8"));
  Mapper mapper = xStream.getMapper();
  xStream.alias(rootNodeName, List.class);
  xStream.registerConverter(new MapConverter(mapper));
  return xStream.toXML(mapList);
 }
 
 public String toXML(Map<String, Object> map) {
  XStream xStream = new XStream(new DomDriver("UTF-8"));
  Mapper mapper = xStream.getMapper();
  xStream.alias(rootNodeName, Map.class);
  xStream.registerConverter(new MapConverter(mapper));
  return xStream.toXML(map);
 }
 
 public static class MapConverter extends AbstractCollectionConverter implements Converter {
  *//**
   * Map 객체가 될 Node 명
   *//*
  private String nodeName = "itemInfo";

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

  *//**
   * Converting 가능한 샘플인지 판단
   *//*
  @Override
  public boolean canConvert(Class type) {
   boolean flag = type.equals(java.util.ArrayList.class);
   return flag;
  }

  *//** Map을 XML로 변환하는 규칙 *//*
  @Override
  public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
   List<Map<String, Object>> list = (List<Map<String, Object>>) source;
   for(int inx=0; inx<list.size(); inx++) {
    Map<String, Object> data = list.get(inx);
    writer.startNode(nodeName);
    for (Object obj : data.entrySet()) {
     Entry<String, Object> ety = (Entry<String, Object>)obj;
     writer.startNode(ety.getKey().toString());
     writer.setValue(ety.getValue().toString());
     writer.endNode();
    }
    writer.endNode();
   }
  }

  *//** XML을 List<Map>으로 변환하는 규칙 *//*
  @Override
  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
   List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
   Map<String, Object> element = null;
   for (; reader.hasMoreChildren(); reader.moveUp()) {
    reader.moveDown();
    element = new HashMap<String, Object>();
    for (; reader.hasMoreChildren(); reader.moveUp()) {
     reader.moveDown();
     String tempValue = reader.getValue();
     String tempKey = reader.getNodeName();
     
     if (tempValue != null) {
      tempValue = tempValue.trim().replaceAll("\n", "");
     }
     element.put(tempKey, tempValue);
    }
    resultList.add(element);
   } 
   return resultList;
  }
  
 }
 */
}




 

+ Recent posts