XML--Java中的四种常见解析方式--Sax

Sax解析主要思路

构建方式:

SAXParserFactory saf=SAXParserFactory.newInstance();
SAXParser sp=saf.newSAXParser();
SAXHandler handler=new SAXHandler();
sp.parse("E:\\books.xml", handler);

主要就是自定义一个继承DefaultHandler的自定义SAXHandler(理论上名字随意起)。

然后同过重写SAXHandler的startElement()、startDocument()、endElement()、endDocument()方法实现所需。

public class Sax {


    public static void main(String[] args) throws Exception {
        SAXParserFactory saf=SAXParserFactory.newInstance();
        SAXParser sp=saf.newSAXParser();
        SAXHandler handler=new SAXHandler();
        sp.parse("E:\\books.xml", handler);
         for(book bo:handler.getBookList()){
             System.out.println("第"+bo.id+"本书");
             System.out.println("书名:"+bo.name);
             System.out.println("出版年份:"+bo.years);
             System.out.println("价格:"+bo.price);
         }
    }

}

自定义SAXHandler

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;




public class SAXHandler extends DefaultHandler {
    String value = null;
    book booktemp;
    private ArrayList<book> bookList = new ArrayList<book>();
    public ArrayList<book> getBookList() {
        return bookList;
    }

    int bookIndex = 0;
    /**
     * 用来标识解析开始
     */
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
        System.out.println("SAX解析开始");
    }
    
    /**
     * 用来标识解析结束
     */
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("SAX解析结束");
    }
    
    /**
     * 解析xml元素
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //调用DefaultHandler类的startElement方法
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("book")) {
            bookIndex++;
            //创建一个book对象
            booktemp = new book();
            //开始解析book元素的属性
            System.out.println("======================开始遍历某一本书的内容=================");
//            //已知book元素下属性的名称,根据属性名称获取属性值
//            String value = attributes.getValue("id");
//            System.out.println("book的属性值是:" + value);
            //不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
            int num = attributes.getLength();
            for(int i = 0; i < num; i++){
                System.out.print("book元素的第" + (i + 1) +  "个属性名是:"
                        + attributes.getQName(i));
                System.out.println("---属性值是:" + attributes.getValue(i));
                if (attributes.getQName(i).equals("id")) {
                    booktemp.id=(attributes.getValue(i));
                }
            }
        }
        else if (!qName.equals("name") && !qName.equals("booklist")) {
            System.out.print("节点名是:" + qName + "---");
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //调用DefaultHandler类的endElement方法
        super.endElement(uri, localName, qName);
        //判断是否针对一本书已经遍历结束
        if (qName.equals("book")) {
            bookList.add(booktemp);
            booktemp = null;
            System.out.println("======================结束遍历某一本书的内容=================");
        }
        else if (qName.equals("name")) {
            booktemp.name=(value);
        }
        else if (qName.equals("years")) {
            booktemp.years=(value);
        }
        
        else if (qName.equals("price")) {
            booktemp.price=(value);
        }
    }
    
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        value = new String(ch, start, length);
        if (!value.trim().equals("")) {
            System.out.println("节点值是:" + value);
        }
    }
}

 

posted on 2017-04-11 10:50  986424017  阅读(107)  评论(0)    收藏  举报

导航