SPRING
2019.01.13 / 22:16

[XML] XML 파싱과 VO 매핑시키기

hanulbit
추천 수 20

델파이를 통해서 넘어온 XML 데이터를 multipart로 받아서 일괄 등록할때 처리하는 내용입니다.

이렇게 받아 임시 폴더에 저장해놓습니다.

MultipartRequest file =

new MultipartRequest(request, savePath, 1000*1024*1024, "utf-8");

임시 폴더에 있는 애들은 crontab 써서 주기적으로 지워지고 있네요. ㅋ

XML 파일을 갖다가 넘겨서 그리고 가지고 와서 파싱합니다.

 public Object[] drwngXmlParser(String fileName) {
  Object[] object = new Object[3];
  ArrayList<HashMap<String, String>> infoList = new ArrayList<HashMap<String, String>>();
  
  try {
   SAXBuilder sber = new SAXBuilder();
   File  xmlFileNm = new File(savePath+"/"+fileName);
   Document doc = sber.build(xmlFileNm);
   Element root = doc.getRootElement();
   List<Element> info = root.getChildren();

   //루트 엘리먼드 얻어옴
   for(int i=0; i<info.size(); i++){  

   //루트 하위 엘리먼트가 개수만큼 반복
    if(hasChildren(info.get(i))) {  

   //hasChildren을 통해 반복중인 Element가 자식을 가졌는지 여부를 판단
     List<Element> drwng = info.get(i).getChildren(); 

   //있다면 해당 Element의 자식노드 리스트를 가져옴
     HashMap<String, String> infoMap = new HashMap<String, String>();

   //text 데이터를 담을 map 생성
     for(int j=0; j<drwng.size(); j++){ 

   //이 하위 element의 개수만큼 반복함
      if(hasChildren(drwng.get(j))) { 

   //hasChildren을 통해 하위 노드가 있는지 파악
       List<Element> docInfo = drwng.get(j).getChildren(); 

   //있다면 해당 element의 자식노드 리스트를 가져옴
       for(int l=0; l<docInfo.size(); l++) { 

   //하위 노드들을 반복함
        infoMap.put(docInfo.get(l).getName().replace("-", "").toUpperCase(),   

        docInfo.get(l).getText());

   //노드의 text를 map에 담음
       }
      } else {
       infoMap.put(drwng.get(j).getName().replace("-", "").toUpperCase(),

       drwng.get(j).getText());

   //하위 노드가 없다면 현재 노드의 text 정보를 담음
      }
     }
     infoList.add(infoMap);

   //map을 list에 담음(<drwng> 하나가 add 됨)
    } else {
     object[i] = info.get(i).getText();

   //udt_cnt와 dvsn_cd를 object에 담음
    }
   }
   object[2] = infoList;

   //drwng List를 object2에 담는다.
  } catch(Exception e) {
   e.getStackTrace();
  }
  return object;
 }

 

이렇게 해서 파싱한 결과는 리스트에 담아서 return 하게 됩니다.

이때 궁금했던게 자바 리플렉션이었는데요. 머 어디다가 어떻게 써야 잘쓰는지도 모르겠고 해서 그냥 VO를 매핑시키는데 썼습니다. VO는 바뀔수도 있으니까요 ~ 그리고 xml element값이랑만 맞춰주면 되니까

public ArrayList<DrwngAllInfo> domainMapping(ArrayList<HashMap<String, String>> mapList) throws Exception {
  Class<?> c = Class.forName("com.ese.domain.DrwngAllInfo");
  Method[] methods = c.getMethods();
  ArrayList<DrwngAllInfo> drwngList = new ArrayList<DrwngAllInfo>();

  try {
   for(HashMap<String, String> list : mapList) {
    DrwngAllInfo target = (DrwngAllInfo) c.newInstance();
    Iterator iter = list.keySet().iterator();
    while(iter.hasNext()) {
     String key = (String) iter.next();
     for(int i=0; i<methods.length; i++) {
      if(methods[i].getName().startsWith("set")) {
       if(methods[i].getName().replace("set", "").toUpperCase().equals(key.replace("_", "").toUpperCase())){
        String colunm = methods[i].getName().replace("set", "").toUpperCase();
        Class<?>[] types = methods[i].getParameterTypes(); 
        Method m = c.getMethod(methods[i].getName(), types[0]);
        if(types[0].toString().equals("int"))
         m.invoke(target, Integer.parseInt(list.get(key)));
        else
         m.invoke(target, list.get(key));
        }
       }
      }
     }
    drwngList.add(target);
    }
   
  } catch(Exception e) {
   throw e;
  }

  return drwngList;
 }

 

마지막에 보면 끝으로 target이라는 이름으로 생성된 VO객체를 add하게 됩니다.

이렇게 xml이 VO객체에 매핑된거죠. 지금보니 map에 담지 않고 그냥 xml을 vo에 담았더라면 조금 더 빨라졌을텐데라는 생각을 해봅니다.