解析XML文件___SAX解析

sax解析xml

// 得到SAXParserFactory
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    // 得到SAXParser
        SAXParser saxParser = saxParserFactory.newSAXParser();
            // 得到XMLReader
            XMLReader xmlReader = saxParser.getXMLReader();
            // 給XMLReader設置監聽
            xmlReader.setContentHandler(handler);
// 解析文件 Parse解析的意思
xmlReader.parse(new InputSource(getAssets().open("student.xml")));

ContentHandler是接口,實現類 DefaultHandler

private ContentHandler handler = new DefaultHandler() {

        private String targetName;
        private List<Student> ss;
        private Student student;

        @Override
        public void startDocument() throws SAXException {
            System.out.println("讀取文件開始");
            ss = new ArrayList<Student>();
            super.startDocument();
        }

        @Override
        public void endDocument() throws SAXException {
            System.out.println("讀取文件結束");
            System.out.println(ss);
            super.endDocument();
        }

        @Override
        public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
            targetName = localName;
            System.out.println("讀取開始標籤" + targetName);
            if ("student".equals(targetName)) {
                student = new Student();
                String value = attributes.getValue("id");
                student.setId(Integer.parseInt(value));
            }
            super.startElement(uri, localName, qName, attributes);
        }

        @Override
        public void endElement(String uri, String localName, String qName)throws SAXException {
            // 用的是localName
            System.out.println("讀取結束標籤" + localName);
            if ("student".equals(localName)) {
                System.out.println("-----" + student);
                ss.add(student);
                student = null;//可以不寫
            }
            targetName = null;
    /**當解析結束時置爲空。這裏很重要, 如果這裏不把preTag置爲null,根據startElement(....)方法,preTag的值還是book,當文檔順序讀到圖中標記4的位置時,會執行characters(char[] ch, int start, int length)這個方法,而characters(....)方 法判斷preTag!=null,會執行if判斷的代碼,這樣就會把空值賦值給book,這不是我們想要的。*/  
            super.endElement(uri, localName, qName);
        }

        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // 判斷targetname不爲空後少執行3次(endElement後就不執行了),因爲在endElement方法中將targetname置空,
            if (targetName != null) {
                String str = new String(ch, start, length);
                System.out.println("text" + str);
                if ("name".equals(targetName)) {
                    student.setName(str);
                } else if ("age".equals(targetName)) {
                    student.setAge(Integer.parseInt(str));
                }
                super.characters(ch, start, length);
            }
        }
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章