오랜만에 포스팅을 하게 되었습니다. (프로젝트 기간이여서 굉장히 바빴답니다.ㅎㅎ)
오늘은 프로젝트에서 사용한 xml 파싱하는 코드를 알아보도록 하겠습니다.
XML 파일 Parsing 하기
parsing 할 xml 파일 예시를 보여드리겠습니다.
<body>
<items>
<item>
<addr1>제주특별자치도 제주시 세화14길 3</addr1>
<cat1>A05</cat1>
<cat2>A0502</cat2>
<cat3>A05020900</cat3>
<contentid>2850913</contentid>
</item>
<item>
<addr1>제주특별자치도 제주시 복지로북길 4</addr1>
<cat1>A05</cat1>
<cat2>A0502</cat2>
<cat3>A05020100</cat3>
<contentid>2906155</contentid>
</item>
</items>
</body>
이렇게 제주도에 대한 주소, 카테고리명들, 컨텐트 아이디가 있다고 가정해 봅시다.
주소, 카테고리, 컨텐트 아이디를 파싱을 하기 위한 Java 코드를 작성해 보겠습니다.
public void xmlParsing() {
try {
File file = new File("xml 파일이 저장된 위치/***.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
document.getDocumentElement().normalize();
NodeList nList = document.getElementsByTagName("item");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
AreaVO areaVO = new AreaVO();
areaVO.setAddr1(eElement.getElementsByTagName("addr1").item(0).getTextContent());
areaVO.setCat1(eElement.getElementsByTagName("cat1").item(0).getTextContent());
areaVO.setCat2(eElement.getElementsByTagName("cat2").item(0).getTextContent());
areaVO.setCat3(eElement.getElementsByTagName("cat3").item(0).getTextContent());
areaVO.setContentid(
Integer.parseInt(eElement.getElementsByTagName("contentid").item(0).getTextContent()));
areaMapper.registerArea(areaVO);
}
}
} catch (IOException | ParserConfigurationException | SAXException e) {
System.out.println(e);
}
}
처음부터 설명드리겠습니다.
1. 파싱할 XML 파일의 경로를 가리키는 File 객체를 생성합니다.
File file = new File("...");
2. XML 문서를 파싱하기 위한 DocumentBuilder를 생성하기 위한 DocumentBuilderFactory 객체를 생성합니다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
3. DocumentBuilderFactory를 사용하여 실제로 XML 문서를 parsing할 DocumentBuilder 객체를 생성합니다.
DocumentBuilder db = dbf.newDocumentBuilder();
4. DocumentBuilder를 사용하여 XML 파일을 파싱하여 Document 객체로 변환합니다.
Document document = db.parse(file);
5. XML 문서의 루트 요소를 가져와서 정규화(normalize)합니다.
✨이러한 작업을 하는 이유는 XML 문서를 작성하거나 생성하는 과정에서 인간의 실수나 다양한 프로세싱 도중의 변화로 인해 일관성 없는 형태로 문서 구조가 만들어질 수 있기 때문입니다.
document.getDocumentElement().normalize();
6. XML 문서에서 "item" 요소들을 NodeList로 가져옵니다.
NodeList nList = document.getElementsByTagName("item");
7. for문 내부 코드
- NodeList에서 현재 순회 중인 item 요소를 가져옵니다.
Node nNode = nList.item(temp);
- 현재 노드의 타입이 ELEMENT_NODE 요소인지 확인하고 현재 노드를 Element로 변환합니다.
if (nNode.getNodeType() == Node.ELEMENT_NODE){
Element eElement = (Element) nNode;
}
8. 이후의 코드는 DB에 저장될 객체의 값을 지정해주는 코드입니다.
Element에 있는 text를 가져와서 객체에 set 해주는 메서드입니다.
areaVO.setAddr1(eElement.getElementsByTagName("addr1").item(0).getTextContent());
소감
오랜만에 글을 작성하니까 어색하네요.... 이제부터 새로 배우는 것이나 같이 알아가보고 싶은 것이 있으면 종종 글을 작성하겠습니다. XML 파싱하는 것은 뭔가 JDBC 연결과 유사하다고 생각합니다. 자주 사용하지는 않겠지만 알아둔다면 누군가 저장해 놓은 XML 파일들을 불러와서 저장할 때는 수월할 것이라고 생각됩니다.