자바 XML Parser - Custom Parser

-  Language/Java | 2011. 12. 8. 11:17
Posted by 리뱅

직접 구현된 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;
    }
}
 

블로그 이미지

리뱅

카테고리

전체보기 (13)
-  DeFiero3DStudio (0)
-  Language (6)
-  Development (0)
-  Drawing (0)
-  Car Story (0)
-  Photo Story (0)
-  Music Story (5)
-  Game Story (0)
-  IT Story (0)
잡설 (1)