JAVA SAX解析XML

1、SAX按照xml文件的顺序来逐步解析。DOM处理方式需要将整个xml读入,然后在内存中创建DOM树,生成DOM树上的每个Node对象;SAX方式不同于DOM的文档驱动,它是事件驱动,它不需要读入整个文档,文档的读入过程即是SAX的解析过程。事件驱动是一种基于回调机制的程序运行方法。
2、优缺点:
SAX优点:
->采用事件驱动模式,对内存消耗比较小
->适用于只需要处理xml中数据时
SAX缺点:
->不易编码
->很难同时访问同一个xml中的多处不同数据
3、SAX解析过程及源码
//获取SAXParserFactory实例
SAXParserFactory spf = SAXParserFactory.newInstance();
//通过SAXParserFactory实例返回一个SAXParser实例
try {
SAXParser parser = spf.newSAXParser();
//创建SAXParserHandler
SAXParserHander handler = new SAXParserHander();
parser.parse(“xmlPractise/books.xml”, handler);
System.out.println(“~!~!~!共有” + handler.getBookList().size() + “本书”);
for(Book book : handler.getBookList()){
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getYear());
System.out.println(book.getPrice());
System.out.println(book.getLanguage());
System.out.println(“==========finish========”);
}
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3.1 上述代码中handler的实现代码
public class SAXParserHander extends DefaultHandler {

String value = null;

Book book = null;

private ArrayList<Book> bookList = new ArrayList<Book>();

int bookIndex = 0;
/**
 * 用来遍历xml文件的开始标签
 */
@Override
public void startElement(String uri, String localName, String qName, 
        Attributes attributes) throws SAXException {
    //调用DefaultHandler类的startElement方法
    super.startElement(uri, localName, qName, attributes);
    //开始解析book元素的属性
    if(qName.equals("book")){
        //创建一个book对象
        book = new Book();
        bookIndex ++;
        System.out.println("===================下面开始遍历第" + bookIndex +"本书的内容开始=================");
        //已知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")){
                book.setId(attributes.getValue(i));
            }
        }
    }else if(!qName.equals("book") && !qName.equals("bookstore")){
        System.out.print("节点名是:" + qName);
    }
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
    super.characters(ch, start, length);
    value = new String(ch, start, length);
    if(!value.trim().equals("")){
        System.out.println("--节点值是:" + value);
    }
}

/**
 * 用来遍历xml文件的结束标签
 */
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
    //调用DefaultHandler类的endElement方法
    super.endElement(uri, localName, qName);
    //判断是否针对一本书已经遍历结束
    if(qName.equals("book")){
        this.bookList.add(book);
        book = null;
        System.out.println("===================下面开始遍历第" + bookIndex +"本书的内容结束=================");
    }else if(qName.equals("name")){
        this.book.setName(value);
    }else if(qName.equals("author")){
        this.book.setAuthor(value);
    }else if(qName.equals("year")){
        this.book.setYear(value);
    }else if(qName.equals("price")){
        this.book.setPrice(value);
    }else if(qName.equals("language")){
        this.book.setLanguage(value);
    }
}

/**
 * 用来标识解析开始
 */
@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解析结束");
}

/**
 * @return the bookList
 */
public ArrayList<Book> getBookList() {
    return bookList;
}

/**
 * @param bookList the bookList to set
 */
public void setBookList(ArrayList<Book> bookList) {
    this.bookList = bookList;
}

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值