자바 XML Parser - Custom Parser
- Language/Java |
2011. 12. 8. 11:17
직접 구현된 XML Parser 입니다. 원리도 간단하고, 사용방법 또한 간단하지만.. SAX나 Dom파서 만큼 강력한 기능을 지원하지는 않습니다.
가장 기초적인 데이터 값을 얻어 오기 위한 파서 입니다.
사실 이 방법은 일반적인 윈도우 및 안드로이드와 같은 환경에서 사용할 필요는 없습니다.
윈도우 및 안드로이드나 혹은 다양한 라이브러리를 지원하는 환경에서는 SAX나 Dom을 이용할 수 있지만
이를 지원해주지 않는 Embeded 시스템에서는 꼭 필요한 기능입니다.
실제로 현재 개발중인 프로젝트에서 LG 셋탑에서는 DOM을 지원하지만 SK셋탑은 SAX파서만 지원합니다.
이렇게 개발 환경이 틀린 경우 포팅시, 혹은 개발시 일이 2중으로 커지기 때문에, 공통으로 사용할 수 있는 파서를 직접 작성하게 되었습니다
공부하시는분들도 참고하시면 좋은 자료가 될 듯 합니다.
/** * XML 파서 정의 * * @author LeeBaeng * */ public final class XMLParser { /** * XML을 파싱한다. * * @param strUrl xml의 주소 */ public static void parse(String strUrl){ HttpURLConnection urlCon = null; URL netURL = null; netURL = new URL(strUrl); urlCon = (HttpURLConnection)netURL.openConnection(); urlCon.connect(); int responseCode = urlCon.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { RS.out("Request Method : " + urlCon.getRequestMethod()); RS.out("Request Code : " + urlCon.getResponseCode()); RS.out("Request Message : " + urlCon.getResponseMessage()); BufferedReader in = new BufferedReader(new InputStreamReader(urlCon.getInputStream())); BufferedInputStream bi = new BufferedInputStream(urlCon.getInputStream()); } InputStream in = urlCon.getInputStream(); String xmlData = getXMLFile(in, "EUC-KR"); int xmlIntValue = getXMLTagValueFromInt(xmlData, "tagName(section)"); String xmlStringValue = getXMLTagValueFromString(xmlData, "tagName(section)_String"); System.out.println("xmlIntValue > " + xmlIntValue ); System.out.println("xmlStringValue > " + xmlStringValue ); } /** * XML 파일을 불러와 문자열로 저장한다. * * @param stream 스트림 * @param encodingFormat 인코딩 * @return XML 데이터 */ public static String getXMLFile(InputStream stream, String encodingFormat) throws Exception { String data = ""; StringBuffer buffer = new StringBuffer(); try { InputStreamReader ipStream = new InputStreamReader(stream, encodingFormat); BufferedReader bufferReader = new BufferedReader(ipStream); for (int c = 0; (c = bufferReader.read()) != -1;) buffer.append((char) c); data = buffer.toString(); } catch (Exception e) { e.printStackTrace(); return buffer.toString(); } return data; } /** * XML 문서로 부터 문자열 값을 구한다 * * @param xmlString xml데이터 문자열 * @param section 태그 이름(섹션) * @return XML 문서에서 얻은 문자열 값 */ public static String getXMLTagValueFromString(String xmlString, String section){ try{ String beginTagToSearch = "<" + section + ">"; String endTagToSearch = "</" + section + ">"; String subs=""; for(int index = xmlString.indexOf(beginTagToSearch); index != -1; index = xmlString.indexOf(beginTagToSearch)) { int lastIndex = xmlString.indexOf(endTagToSearch); if(lastIndex == -1 || lastIndex < index) throw new Exception("Parse Error"); subs = xmlString.substring(index + beginTagToSearch.length(), lastIndex); try { xmlString = xmlString.substring(lastIndex + endTagToSearch.length()); } catch(Exception _ex) { xmlString = ""; } } System.out.println("Receive Value["+section+"] = " + subs); return subs; }catch (Exception e) { return ""; } } /** * XML 문서로 부터 정수형 값을 구한다 * * @param xmlString xml데이터 문자열 * @param section 태그 이름(섹션) * @return XML 문서에서 얻은 정수형 값 */ public static int getXMLTagValueFromInt(String xmlString, String section){ try{ String str = getXMLTagValueFromString(xmlString, section); if(str != "" && !str.equals("")){ return Integer.parseInt(str); }else{ return 0; } }catch (Exception e) { return 0; } } /** * XML 문서로 부터 정수형 배열 값을 구한다. * * @param xmlData xml데이터 문자열 * @param section 태그 이름(섹션) * @param token 문자열 구분자 * @return xml로 부터 구한 정수형 배열 값 */ private static int[] getArrayValueInt(String xmlData, String section, String token) throws Exception{ int[] value = null; StringTokenizer strTok; int i = 0; strTok = new StringTokenizer(getXMLTagValueFromString(xmlData, section), token); value = new int[strTok.countTokens()]; for(i=0; i<value.length; i++) value[i] = Integer.parseInt(strTok.nextToken()); return value; } /** * XML 문서로 부터 스트링 배열 값을 구한다. * * @param xmlData xml데이터 문자열 * @param section 태그 이름(섹션) * @param token 문자열 구분자 * @return xml로 부터 구한 스트링 배열 값 */ private static String[] getArrayValueStr(String xmlData, String section, String token) throws Exception{ String[] strs = null; StringTokenizer strTok; int i = 0; strTok = new StringTokenizer(getXMLTagValueFromString(xmlData, section), token); strs = new String[strTok.countTokens()]; for(i=0; i<strs.length; i++){ strs[i] = strTok.nextToken(); } return strs; } /** * 태그의 총 카운트를 구한다. * * @param xmlString XML데이터 스트링 문자열 * @param section 태그 섹션 이름 * @return 태그의 총 카운트 */ public static int getXMLTagCount(String xmlString, String section) throws Exception { String beginTagToSearch = "<" + section + ">"; String endTagToSearch = "</" + section + ">"; int index = xmlString.indexOf(beginTagToSearch); int counter = 0; for(; index != -1; index = xmlString.indexOf(beginTagToSearch)) { int lastIndex = xmlString.indexOf(endTagToSearch); if(lastIndex == -1 || lastIndex < index) throw new Exception("Parse Error"); counter++; try { xmlString = xmlString.substring(lastIndex + endTagToSearch.length()); } catch(Exception _ex) { xmlString = ""; } } return counter; } }