XML学习之SAX解析XML文件

来源:互联网 发布:android studio mac 编辑:程序博客网 时间:2024/05/01 19:32

                   XML学习之SAX解析XML文件

一、SAX解析方式概述

1Sax解析允许每读取一行文本就解析一行文本的方式对XML文件进行解析。不必等到读取完文件后才开始解析。提高了解析速度。

2sax采用事件处理方式解析XML文件,利用SAX解析XML文档,涉及两个问他:解析器和事件处理器。

  (1)、解析器:解析器可以使用JAXPAPI创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用 事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

(2)、事件处理器由我们自己编写,这样就可以通过事件处理器中方法的参数来得到SAX解析器解析到的xml数据。

二、使用SAX方式解析XML文档   

  1、使用SAX解析XML步骤

  (1)、使用SAX解析器解析XML文档必须先得到一个SAXParserFactory类。

  (2)、使用SAXParserFactory得到SAXParser 解析器

         SAXParser parser=SAXParserFactory.newInstance().newSAXParser()

 (3)、使用SAXParser 得到XMLReader读取器

       XMLReader reder= sp.getXMLReader();

 (4)、编写事件处理器

阅读javaSE Api:发现在org.xml.sax包中,已经定义了四个解析XML的事件处理器接口,分别是

ContentHandler:接收文档逻辑内容的通知

DTDhandler:接收基本的DTD相关的事件的通知

ErrorHandler:SAX错误处理程序的基本接口

EntityResolver:用来解析实体的基本接口。

编程人员只要实现这几个事件处理器接口就可以获得解析到的xml数据了。

 (5)、使用XMLReader读取器设置处理器。

   reader.setContentHandler(myHander);  

  (6)、开始解析

        reader.parse("src/book.xml");

2、使用sax方式解析XML文件小程序

下面这个例子用来解析一个XML文件,并将解析到的数据封装到一个javabean中。所使用的xml文件为src\book.xml

(1)Book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>  <书 出版社="xx出版社">      <书名>JavaWeb开发</书名>      <作者>xxx</作者>      <价格>68.0</价格>  </书>   <书 出版社="xx出版社">      <书名>AJAX开发实战</书名>      <作者>浩宇</作者>      <价格>100</价格>    </书></书架>


 

(2)、定义一个Book类,用来封闭xml中读取到的数据

package cn.itheima.entity;public class Book { private String name; private String author; private String price; private String edtion; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getEdtion() { return edtion; } public void setEdtion(String edtion) { this.edtion = edtion; }    public String toString()    {     return "书名:"+name+";作者:"+author+";出版社:"+edtion+";价格:"+price;    }}


 

3)、使用saxXML文件进行解析,将解析到的文件封装到一个List<book>解析中来。

package cn.itheima.sax;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import cn.itheima.entity.Book;/** * 使得SAX方式得到XML中的某一个元素 * @author Administrator * */public class SAXstu2 { /**  * @param args  */ public static void main(String[] args) { //得到sax解析器工厂SAXParserFactory spf=SAXParserFactory.newInstance(); //定义一个解析器SAXParser sp=null; //定义一个读取器XMLReader reader=null; List<Book> listBooks=null; try { //得到解析器sp=spf.newSAXParser(); reader=sp.getXMLReader(); MyContentHander mch=new MyContentHander(); reader.setContentHandler(mch); listBooks=mch.getList(); reader.parse("src/book.xml"); for (Book book : listBooks) { System.out.println(book.toString()); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}/** * 声明一个内容处理器来获得所有的书本信息 * @author Administrator * */class MyContentHander extends DefaultHandler{    //声明一个内容处理器来获得所有的书本信息 private List<Book> list=new ArrayList<Book>(); Book book=null; String currentTag=null;//声明一个节点名称,用来 保存当前的节点名称 @Override public void characters(char[] ch, int start, int length) throws SAXException { if("书名".equals(currentTag)) { book.setName(new String(ch,start,length)); } if("作者".equals(currentTag)) { book.setAuthor(new String(ch,start,length)); } if("价格".equals(currentTag)) { book.setPrice(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("书".equals(qName)) { list.add(book); book=null; } currentTag=null; } public List<Book> getList() { return list; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("书".equals(qName)) { book=new Book(); book.setEdtion(attributes.getValue("出版社")); }currentTag=qName; }}