SaxParser 사용하기

xml version="1.0" encoding="UTF-8" ?>
<class>
    <student rollno="393">
        <firstname>dinkar</firstname>
        <lastname>kad</lastname>
        <nickname>dinkar</nickname>
        <marks>85</marks>
    </student>
 
 
    <student rollno="493">
        <firstname>Vaneet</firstname>
        <lastname>Gupta</lastname>
        <nickname>vinni</nickname>
        <marks>95</marks>
    </student>
 
    <student rollno="593">
        <firstname>jasvir</firstname>
        <lastname>singn</lastname>
        <nickname>jazz</nickname>
        <marks>90</marks>
    </student>
 
</class>


?
package adun.snippet.ssp.sax;
 
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
 
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
public class SaxTest {
 
    public static void main(String[] args){
        InputStream in = null;
        try {
            in = SaxTest.class.getResourceAsStream("student.xml");
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SaxHandler handler = new SaxHandler();
            saxParser.parse(in, handler);
            Map model = handler.getModel();
            System.out.println(model.entrySet());
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
        }
 
    }
 
    public static void parseZip(){
        InputStream zis = null;
 
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SaxHandler handler = new SaxHandler();
            Map model = handler.getModel();
 
            URL url = SaxZipTest.class.getResource("student.zip");
            File file = new File(url.getFile());
            ZipFile zipfile = new ZipFile(file);
            ZipEntry entry = zipfile.getEntry("student.xml");
            if (entry != null) {
                zis = zipfile.getInputStream(entry);
                saxParser.parse(zis, handler);
            }
 
            zis = zipfile.getInputStream(zipfile.getEntry("student2.xml"));
            saxParser.parse(zis, handler);
 
            System.out.println(model.entrySet());
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (zis != null) {
                try {
                    zis.close();
                } catch (IOException e) {
                }
            }
        }
 
    }
    public static class SaxHandler extends DefaultHandler {
 
        private Map model = new HashMap();
 
        /**
         * xml의 element의 path를 저장하는 변수
         */
        private StringBuffer path = new StringBuffer();
 
        /**
         * 현재 parsing을 하고 있는 xml element node의 name
         */
        private String nodeName;
 
        /**
         * 현재 parsing을 하고 있는 xml element node의 value
         */
        private StringBuffer nodeValue;
 
        /**
         * 현재 parsing을 하고 있는 위치를 저장할 location 객체
         */
        private Locator loc;
 
        /**
         * 현재 parsing을 하고 있는 Student 객체
         */
        private Student student;
 
        @Override
        public void setDocumentLocator(Locator locator){
            this.loc = locator;
        }
 
        public Locator getDocumentLocator(){
            return this.loc;
        }
 
        public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) throws SAXException{
            path.append("/").append(qName);
            if ("/class".equals(path.toString())) {
            } else if ("/class/student".equals(path.toString())) {
                student = new Student();
                student.setRollno(Integer.parseInt(attrs.getValue("rollno")));
            }
            nodeName = qName;
        }
 
        /**
         * xml의 element가 닫힐때 자동으로 호출
         *
         * @param namespaceURI - namespace URI
         * @param localName - The local name (without prefix), xml Namespace processing을 사용하지 않으므로 사용되지 않는다.
         * @param qname - The qualified name (with prefix)
         * @throws SAXException
         */
        public void endElement(String namespaceURI, String localName, String qName) throws SAXException{
            //            System.out.println("endElement : " + path);
            if (nodeName.equals(qName)) { //leap node
                String value = nodeValue.toString().trim();
                if ("/class/student/firstname".equals(path.toString())) {
                    student.setFirstName(value);
                } else if ("/class/student/lastname".equals(path.toString())) {
                    student.setLastName(value);
                } else if ("/class/student/nickname".equals(path.toString())) {
                    student.setNickName(value);
                } else if ("/class/student/marks".equals(path.toString())) {
                    student.setMarks(Integer.parseInt(value));
                }
 
            } else {
                if ("/class/student".equals(path.toString())) {
                    model.put(student.getRollno(), student);
                    student = null;
                }
            }
            nodeValue = null;
            path.delete(path.lastIndexOf("/"), path.length());
        }
 
        /**
         * xml의 element node에 character data가 존재하는 경우 자동으로 호출되며 해당 data를 nodeValue 전역변수에 할당한다.
         *
         * @param ch - The characters
         * @param start - The start position in the character array
         * @param length - The number of characters to use from the character array
         * @throws SAXException
         */
        public void characters(char[] ch, int start, int length) throws SAXException{
            if (length == 0) return;
            String text = new String(ch, start, length);
            if (nodeValue == null) nodeValue = new StringBuffer(text);
            else nodeValue.append(text);
        }
 
        /**
         * xml을 통해서 만들어진 Map을 return한다.
         *
         * @return Map
         */
        public Map getModel(){
            return model;
        }
 
        @Override
        public void endDocument() throws SAXException{}
    }
 
    public static class Student {
 
        private String firstName;
 
        private String lastName;
 
        private String nickName;
 
        private int marks;
 
        private int rollno;
 
        public Student() {
 
        }
 
        public int getRollno(){
            return rollno;
        }
 
        public void setRollno(int rollno){
            this.rollno = rollno;
        }
 
        public String getFirstName(){
            return firstName;
        }
 
        public void setFirstName(String firstName){
            this.firstName = firstName;
        }
 
        public String getLastName(){
            return lastName;
        }
 
        public void setLastName(String lastName){
            this.lastName = lastName;
        }
 
        public String getNickName(){
            return nickName;
        }
 
        public void setNickName(String nickName){
            this.nickName = nickName;
        }
 
        public int getMarks(){
            return marks;
        }
 
        public void setMarks(int marks){
            this.marks = marks;
        }
 
        @Override
        public String toString(){
            StringBuilder sb = new StringBuilder();
            sb.append(getFirstName()).append(" ");
            sb.append(getLastName());
            sb.append("(").append(getNickName()).append(":");
            sb.append(getMarks()).append(")");
            return sb.toString();
        }
    }
}

댓글

이 블로그의 인기 게시물

파일처리(한번에 모두읽기, 라인단위로 읽기, 쓰기, 리스트처리, 특정길이만큼 읽기)

AWS 가용성,확장성

math 함수 쓰기