반응형
1. 설명
이 포스트에서 다룰 예제는 "XML형식의 데이터를 데이터가 담기는 클래스의 객체로 변환"해주는 코드입니다.
예제코드는 지난 포스트에서 생성한 XML데이터를 객체로 변환하는 코드이며,
jackson-dataformat-xml과 jdom 라이브러리를 사용해서 구현했습니다.
※ XmlMapper를 사용한 코드설명은, ObjectMapper와 사용법이 같으므로 생략합니다.
2. 소스코드
- 메서드
public Object parser(String target, Object obj) {
SAXBuilder builder = new SAXBuilder();
InputStream xmlInput = new ByteArrayInputStream(target.getBytes());
Document doc;
Element el;
try {
doc = builder.build(xmlInput, "UTF-8");
el = doc.getRootElement();
getObject(el, obj);
} catch (JDOMException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace();
} catch (Exception e) { e.printStackTrace(); }
this.xmlConverter.resetCount();
return obj;
}
public void getObject(Element el, Object obj) throws ParseException {
int countInFirstRoop = 0;
List<?> childList = el.getChildren();
Iterator<?> childItr = childList.iterator();
while(childItr.hasNext()) {
countInFirstRoop++;
Element childEl = (Element)childItr.next();
String elName = new String(childEl.getName());
List<?> grandChildList = childEl.getChildren();
Iterator<?> grandChildItr = grandChildList.iterator();
if (grandChildItr.hasNext()) {
getObject(childEl, obj);
} else {
List<?> contentList = childEl.getContent();
Iterator<?> contentItr = contentList.iterator();
if (contentItr.hasNext()) {
Content content = (Content) contentItr.next();
if (!this.xmlConverter.xmlToObj(elName, content.getValue(), obj)) {
System.err.println("Error ["+ elName+"], ["+content.getValue()+"]");
}
} else {
System.out.println("("+countInFirstRoop+") "+elName + " : Null value");
}
}
}
}
1) parser메서드를 호출하여 파싱할 XML데이터를 설정합니다.
호출시에 파싱할 XML과 파싱한 데이터를 담을 Object를 지정합니다.
2) parser메서드에서 getObject를 호출하여 XML데이터 파싱을 시작합니다.
(1) Root 노드를 기준으로 자식노드를 모두가져옵니다.
(2) 자식노드도 자식노드를 가지고 있다면 getObject를 다시 호출합니다.
(3) 자식노드를 가지고 있지 않다면 노드의 값에 대해 매핑작업을 실시합니다.
※ 매핑작업 : 노드명(태그명)과 매핑 하려는 파라미터 명이 일치하면 Object에 노드의 값을 넣기.
3) Root노드의 자식노드에 대한 파싱 + 데이터 매핑작업이 끝나면 Object를 리턴합니다
여기서 매핑작업은 변환하려는 객체에 따라 다르므로 각기 다르게 구현해주어야합니다.
따라서 지난 포스트에서 구현한 클래스에 메서드를 추가해줍니다.
public interface XmlConverter {
public String objToXml(Object obj);
public Element makeXmlElement(Object element);
public boolean xmlToObj(String tagName, String value, Object obj) throws ParseException;
public void resetCount();
}
public class XmlConverterItem implements XmlConverter {
@Override
public boolean xmlToObj(String tagName, String value, Object obj) throws ParseException {
if (value == null) return false;
//System.out.println(historyCount+" = Element Name : ["+tagName+"], Value : ["+value+"]");
Item item = (Item) obj;
switch (tagName) {
case "itemId":
item.setItemId(Integer.parseInt(value));
break;
case "itemName":
item.setItemName(value);
break;
case "itemPrice":
item.setItemPrice(Integer.parseInt(value));
break;
case "sales":
item.setSales(Boolean.parseBoolean(value));
break;
case "image" :
item.getImages().add(value);
break;
case "stockHistoryNo":
StockHistory stock = new StockHistory();
stock.setStockHistoryNo(Integer.parseInt(value));
item.getStockHistories().add(historyCount, stock);
break;
case "count":
item.getStockHistories().get(historyCount).setCount(Integer.parseInt(value));
break;
case "receivingDate":
item.getStockHistories().get(historyCount).setReceivingDate(value);
historyCount = 0;
break;
case "joinDate":
item.setJoinDate(value);
break;
default :
return false;
}
return true;
}
@Override
public void resetCount() {
this.historyCount = 0;
}
}
- 메인
public class Data_04_XmlParsing {
static XmlUtil xu = XmlUtil.getInstance();
static FileUtil fu = FileUtil.getInstance();
public static void main(String[] args) {
try {
for (String str : args ) {
System.out.println("Param : "+str);
}
/**
* XML 객체 1개 -> Object지정
*/
xu.setObjToXml(new XmlConverterItem());
System.out.println("---------- XML One -> Object One ----------");
// Xml Mapper를 사용하여 변환된 XML을 다시 Xml Mapper를 사용해서 Object로 변환하는 것은 가능
Item item = (Item)xu.xmlToObj(new File(args[0]), Item.class);
System.out.println("(1) XML Use XmlMapper -> Object : "+item.toString());
System.out.println("");
// SAX parser를 사용하여 XML을 파싱하여 Object에 데이터를 담는다
Item item2 = (Item)xu.parser(new File(args[1]), new Item());
System.out.println("(2) XML -> Object : "+item2.toString());
System.out.println("");
/**
* XML 리스트 -> List<Object지정>
*/
System.out.println("---------- XML List -> List<Object> ----------");
System.out.println("(3) XML List Use XmlMapper -> List<Object>");
Object obj = xu.xmlListToObjList(new File(args[2]), new XmlToObjItemList());
List<Item> items = (List<Item>) obj;
for (Item itemData : items) {
System.out.println(itemData.toString());
}
System.out.println("");
System.out.println("(4) XML List -> List<Object>");
xu.setObjToXml(new XmlConverterItemList());
List<Item> items2 = (List<Item>)xu.parser(new File(args[3]), new ArrayList<Item>());
for (Item itemData : items2) {
System.out.println(itemData.toString());
}
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
3. 실행결과【Windows(이클립스) / Linux】
4. 전체코드
반응형
'프로그래밍 > Java-자주쓰는예제' 카테고리의 다른 글
【Java-데이터 통신】Postman 처럼 HTTP 통신하기 - 2.JSON데이터 CRUD (0) | 2021.09.20 |
---|---|
【Java-데이터 통신】Postman 처럼 HTTP 통신하기 - 1.개요 (0) | 2021.09.20 |
【Java-데이터】 객체를 XML데이터로 변환하기 (0) | 2021.09.19 |
【Java-데이터】Json데이터를 Java 객체로 변환하기 (0) | 2021.09.18 |
【Java-데이터】객체를 Json형식의 데이터로 변환하기 (0) | 2021.09.17 |
댓글