JAVA DOM으로 XML 파싱 by rider

java에서 xml파일을 파싱할때 많이쓰는 XPath와 Dom입니다.

먼저 xml소스입니다.

<?xml version="1.0" encoding="UTF-8"?>
-<item type="text">
<nsid>201603011143461</nsid>
-<title>
<![CDATA[타이틀]>
</title>
<date>2016-03-01</date>
-<content>콘텐츠</content>
<category name="국제" code="0400"/>
-<image_list>
<image href="IMG_URL1" caption=""/>
<image href="IMG_URL1" caption=""/>
</image_list>
<url href="URL"/>
</item>

다른 곳에 올라온 예제들이 태그안에 태그목록이 있는 경우를 설명한 곳이 없어서 목록을 넣어봤습니다.

// XML 파싱 메소드
public void xmlParser(String fileName) {
try {
File file = new File(fileName);
Document docu = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/item";
Node cols = (Node)xpath.compile(expression).evaluate(docu, XPathConstants.NODE);
Element el = (Element)cols;
//태그의 내용을 출력
System.out.println(getTagContent(el, "title"));
//태그의 속성을 출력
System.out.println(getTagContent(el, "category", "code"));
//태그의 리스트를 받아서 속성출력
List<String> imgList = getImageList(el);
for(int i=0; i<imgList.size(); i++) {
System.out.println(imgList.get(i));
}
} catch(Exception e) {
e.printStackTrace();
}
}


XML 파싱 메소드는 파일을 document로 파싱하고, XPath를 활용해서 Node로 만들었습니다. 
만든 Node를 컨트롤하기 위해서 Element로 타입캐스팅을 했습니다.

// 태그 값 
public String getTagContent(Element el, String tagName) {
return el.getElementsByTagName(tagName).item(0).getTextContent();
}

태그 값 메소드는 태그의 내용을 받아오는 기능입니다.
// 태그 속성 값 
public String getTagContent(Element el, String tagName, String attrValue) {
return el.getElementsByTagName(tagName).item(0).getAttributes().getNamedItem(attrValue).getNodeValue();
}

태그의 속성 값 메소드는 태그의 값이 아닌 속성을 받아오도록 했습니다.
// 이미지 주소 목록 
public List<String> getImageList(Element el) {
List<String> imgList  = new ArrayList<String>();
NodeList nl = el.getElementsByTagName("image_list").item(0).getChildNodes();
for(int i=0; i<nl.getLength(); i++) {
if("image".equals(nl.item(i).getNodeName())) {
imgList.add(nl.item(i).getAttributes().getNamedItem("href").toString());
}
}
return imgList;
}

마지막으로 리스트형태로 된 태그들을 받아서 속성값을 뽑아내는 메소드입니다.

결과값은 따로 적지 않겠습니다. 

dom과 xpath를 쓰지 않더라도 sax나 spring의 annotation으로 파싱이 가능합니다.

대용량의 xml파일을 파싱하는 것이 아니라면 이대로 써도 성능의 큰문제가 없습니다.

하지만 수십메가 이상의 대용량이면 sax나 annotation으로 파싱하는 것을 고려해봐야 할 것 같습니다.