음..
델파이를 통해서 넘어온 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에 담았더라면 조금 더 빨라졌을텐데라는 생각을 해봅니다.
'JAVA' 카테고리의 다른 글
자바 특수문자 처리 (0) | 2015.03.06 |
---|---|
자주 까먹는 java 형변환 (0) | 2015.03.02 |
BEAN을 Json으로 변환하기 (0) | 2015.03.02 |
[BINDING] Excel과 VO객체 바인딩 (0) | 2013.10.08 |
[POI] poi를 이용한 Excel 다운로드 (0) | 2013.10.08 |