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
아래 이미지는 엑셀에 저장된 내용이다.
주소 값을 읽어서 해당 위/경도 값을 입력한 것이다.
'개발' 카테고리의 다른 글
[오류노트] Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' (0) | 2016.03.11 |
---|---|
[Java] poi를 이용한 엑셀파일 읽고 쓰기(메이븐) (3) | 2015.12.30 |
[Javascript] 네이버 JavaScript 2.0 지도 사용 (0) | 2015.12.24 |
[Node.js] Express Framework를 이용한 간단한 라우팅 (0) | 2015.12.24 |
[Node.js] Web Module - server & client (0) | 2015.12.18 |