본문 바로가기

개발

[Java] SAXParser를 이용한 XML 파싱 예제



xml 파일을 읽어들여 필요한 값만 추출하는 예제이다. 



Java 파일 생성

XMLSAXParser.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
 
public class XMLSAXParser extends DefaultHandler {
 
    // SAXParserFactory     
    private SAXParserFactory parserFactory;
    
    // SAXParser     
    private SAXParser parser;
    
    // xml 파일 명    
    private String fileName;
 
    // 시작 태그명
    private String startTagName;
 
    // 끝 태그명
    private String endTagName;
    
    // String buffer
    private StringBuffer buffer = new StringBuffer();
    
    // 추출 값 x,y
    private String x;
    private String y;
    
    // 생성자
    public XMLSAXParser() {}
 
    public XMLSAXParser(String fileName) {
        super();
        try {
            parserFactory = SAXParserFactory.newInstance();
            parser = parserFactory.newSAXParser();
        } catch(Exception e) {
            System.out.println("Exception >> " + e.toString());
        }
 
        this.fileName = fileName;
    }
 
    // 문서의 시작
    public void startDocument(){
        //System.out.println("start document!!");
    }
    
    // 문서의 종료
    public void endDocument(){
        //System.out.println("end document!!");
    }
    
    // 시작 태그 인식했을 때 처리
    public void startElement(String url, String name, String elementName, Attributes attrs) 
        throws SAXException {
        startTagName = elementName;      
        //reset
        buffer.setLength(0); 
    }
 
    // 시작태그와 끝태그 사이의 내용을 인식 했을 때 처리
    public void characters(char[] str, int start, int len) throws SAXException {
        buffer.append(str, start, len);
        
        // 태그명 중 'x' 와 'y'값만 추출해서 변수에 담는다.
        if(this.startTagName.equals("x")){
            this.x = buffer.toString().trim();
        }
        if(this.startTagName.equals("y")){
            this.y = buffer.toString().trim();
        }
    }
    
    // 끝태그를 인식 했을 때 처리
    public void endElement(String url, String localName, String name) {
        endTagName = name;
    }
    
    // parse
    public void parse() {
        try {
            parser.parse(fileName, this);
            
        } catch(Exception e) {
            System.out.println("XMLSAXParser Exception " + e.toString());
        }
    }
    
    // 추출 값 가져오기
    public String getX() {
        return x;
    }
 
    public String getY() {
        return y;
    }
 
}
 

cs





main 생성

XmlSaxParserMain.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class XmlSaxParserMain {
    public static void main(String[] args) {
        XMLSAXParser parser = new XMLSAXParser("D:\\test.xml");
        
        try {
            parser.parse();
            
            System.out.println("x = " + parser.getX());
            System.out.println("y = " + parser.getY());
        } catch(Exception e) {
            System.out.println("parser.parse() Exception >> " + e.toString());
        }
    }
}

cs



테스트로 사용할 xml 파일 내용.

네이버 지도 테스트를 위한 것이라 xml 내용은 네이버에 지원하는 openapi 일부분임.

test.xml


1
2
3
4
5
6
7
8
<geocode xmlns="naver:openapi">
    <result>
        <point>
            <x>127.0421438</x>
            <y>37.5163205</y>
        </point>
    </result>
</geocode>
cs



그리고 실행.

이클립스에서 테스트 중이라면 main 페이지에서 Ctrl + F11 실행.



결과출력

x = 127.0421438

y = 37.5163205




 

아래는 네이버api를 이용한 좌표변환 예제이다. (기록용)

프로젝트 진행중 필요한 부분이라 남긴다. 

그냥 참고만..


엑셀파일 읽고 쓰기 예제는 http://jlblog.me/56 


진행 프로세스는 

1. 데이터를 읽기 위해 엑셀파일 열기

2. 엑셀에서 네이버 지도api에 던질 파라미터 값 읽기

3. 네이버 지도api로부터 받은 xml 값 파싱하기

4. xml 파싱 값을 엑셀파일에 쓰기

5. 엑셀파일 저장후 종료 하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
 
public class CoordinateTransformationMain {
 
    public static void main(String[] args) {
        System.out.println("start");
        try {
            // 엑셀파일
            File file = new File("D:\\db.xlsx");
            String xmlUrl = "http://openapi.map.naver.com/api/geocode?key=발급받은키&encoding=utf-8&coord=latlng&output=xml&query=";
            String xmlParam = "";
            
            // 엑셀 파일 오픈
            XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
            
            Cell cell = null;
            
            // 첫번재 sheet 내용 읽기
            for (Row row : wb.getSheetAt(0)) { 
                // 둘째줄부터..
                if (row.getRowNum() < 1) {
                    continue;
                }
                
                // 두번째 셀이 비어있으면 for문을 멈춘다.
                if(row.getCell(1== null){
                    break;
                }
                
                
                xmlParam = row.getCell(1).toString().replace("신주소 : """).replace("구주소 : """).replaceAll(" """);
                //System.out.println(xmlUrl+xmlParam);
                XMLSAXParser parser = new XMLSAXParser(xmlUrl + xmlParam);
                
                try {
                    parser.parse();
                    System.out.println(row.getRowNum());
                    System.out.println("x = " + parser.getX());
                    System.out.println("y = " + parser.getY());
                    System.out.println("address = " + parser.getAddress());
                    
                    // 위도
                    cell = row.createCell(2);
                    cell.setCellValue(parser.getY());
                    // 경도
                    cell = row.createCell(3);
                    cell.setCellValue(parser.getX());
                    
                    
                } catch(Exception e) {
                    System.out.println("parser.parse() Exception >> " + e.toString());
                }
                
                //if(row.getRowNum() == 10){
                //    break;
                //}
            }
            
            // 엑셀 파일 저장
            FileOutputStream fileOut = new FileOutputStream(file);
            wb.write(fileOut);
            wb.close();
            System.out.println("end");
        } catch (FileNotFoundException fe) {
            System.out.println("FileNotFoundException >> " + fe.toString());
        } catch (IOException ie) {
            System.out.println("IOException >> " + ie.toString());
        }
        
    }
}
 

cs


! 위 코드중 xmlParam에 replaceAll(" """) 부분이 빠지면 주소파라미터에 '서울특별시'만 인식해서 똑같은 위경도 값을 리턴한다.



결과출력: 

start

1

x = 127.0422791

y = 37.5160848

address = 서울특별시 강남구 선릉로  668 강남구보건소

2

x = 127.0421438

y = 37.5163205

address = 서울특별시 강남구 삼성동 8

3

x = 127.0475020

y = 37.5173050

address = 서울특별시 강남구 학동로  426 강남구청

4

x = 127.0468177

y = 37.5174494

address = 서울특별시 강남구 삼성동 16

5

x = 127.0629835

y = 37.4992037

address = 서울특별시 강남구 도곡로  516 삼성상가

6

x = 127.0631135

y = 37.4992089

address = 서울특별시 강남구 대치동 990

end



아래 이미지는 엑셀에 저장된 내용이다.

주소 값을 읽어서 해당 위/경도 값을 입력한 것이다.




맨 위로