Sax 实现XML文件解析

来源:互联网 发布:域名服务器的作用 编辑:程序博客网 时间:2024/05/21 06:35

一、XML文件:

<?xml version="1.0"?><Root><View><Left>0</Left><Top>0</Top><Width>1</Width><Height>1</Height><ZIndex>0</ZIndex><File>pic/bg.jpg</File>   <Mode>Pic</Mode></View><View><Left>50</Left><Top>50</Top><Width>0.78125</Width><Height>0.908</Height><ZIndex>2</ZIndex><Path>/video</Path><Path>/213</Path><Path>/425</Path>  <Mode>Cycle</Mode><List>Path</List><Mute>0</Mute></View></Root>

二、Sax解析基类

import java.io.File;   import java.io.InputStream;   import java.io.StringReader;   import javax.xml.parsers.SAXParser;   import javax.xml.parsers.SAXParserFactory;   import org.xml.sax.Attributes;   import org.xml.sax.InputSource;   import org.xml.sax.SAXException;   import org.xml.sax.XMLReader;   import org.xml.sax.helpers.DefaultHandler;  public abstract class  SAXBaseHandler extends DefaultHandler  {// 解析时导入的是xml字符串   public boolean parse(String xmlString) {   return false;   };   // 解析时导入的是xml流   public boolean parse(InputStream xmlInputStream) {   return false;   };   // 解析时导入的是xml的File类型数据   public boolean parse(File file) {   return false;   };   //解析XML输入流public void parserXml(SAXBaseHandler baseHandler,InputStream xmlInputStream) throws Exception {   if (xmlInputStream == null)   return;   //获得解析工厂的实例    SAXParserFactory factory = SAXParserFactory.newInstance();   //获得工厂解析器     SAXParser parser = factory.newSAXParser();   //将一个xml流载入parse方法中,解析正式开始   parser.parse(xmlInputStream, baseHandler);   }   //解析XML文件public void parserXml(SAXBaseHandler baseHandler,File file) throws Exception {   if (file == null)   return;   //获得解析工厂的实例    SAXParserFactory factory = SAXParserFactory.newInstance();   //获得工厂解析器     SAXParser parser = factory.newSAXParser();   //将一个xml文件对象File载入parse方法中,解析正式开始   parser.parse(file, baseHandler);   }   /*   * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, 每解释到新的字符会把它添加到char[]里。 *   * 注意,这个char字符会自己管理存储的字符, 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的,   * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值   * 这里获取的值是标签之间的值如:<item>*********</item>表示星号部分的值   */  public abstract void characters(char[] ch, int start, int length)throws SAXException;   // 用户处理文档解析结束事件   public void endDocument() throws SAXException{};   // 用于处理元素结束事件   public abstract void endElement(String uri, String localName, String qName)throws SAXException;   // 用于处理文档解析开始事件   public void startDocument() throws SAXException{};   /*   * 用于处理元素开始事件,    * 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分 这些重复的元素.qName是什么?   * <name:page ll=""></name:page>这样写就会抛出SAXException错误 通常情况下qName等于localName   */  public abstract void startElement(String uri, String localName,   String qName, Attributes attributes) throws SAXException;   }  

三、Sax解析类:

import java.io.File;   import java.io.InputStream;   import java.util.ArrayList;   import java.util.List;   import java.util.Stack;   import org.xml.sax.Attributes;   import org.xml.sax.SAXException;  public class SAXFileHandler extends SAXBaseHandler{//xml条目private PicControl mItem;   //实例化一个栈用于存放标签   private Stack<String> tagStack = new Stack<String>();//当前标签private String curTag="Root";//实例化一个集合存储PicControl对象   private List<PicControl> list =null;    @Override  public void startDocument() throws SAXException{list = new ArrayList<PicControl>();   };   @Override  public void characters(char[] ch, int start, int length)throws SAXException {   String chars = new String(ch, start, length).trim();   if (chars != null) {   String tagName = (String) tagStack.peek();//从栈中获取一个标签元素   //String tagName = curTag;if (tagName.equals("Left")) {   mItem.setLeft(Float.valueOf(chars)); } else if (tagName.equals("Top")) {   mItem.setTop(Float.valueOf(chars));   } else if (tagName.equals("Width")) {   mItem.setWidth(Float.valueOf(chars));   } else if (tagName.equals("Height")) {   mItem.setHeight(Float.valueOf(chars));   } else if (tagName.equals("ZIndex")) {   mItem.setZindex(Integer.parseInt(chars));   } } }   //结束元素事件@Override  public void endElement(String uri, String localName, String qName)throws SAXException {   tagStack.pop();//当一个标签把他弹出栈   if (qName.equals("View")){//当一个标签结束时将mItem对象添加到list集合中   list.add(mItem);   }   }   @Override  public boolean parse(InputStream xmlInputStream) {   try {   super.parserXml(this, xmlInputStream);   return true;   } catch (Exception e){   e.printStackTrace();   return false;   }   }   @Override  public boolean parse(File file) {   try {   super.parserXml(this, file);   return true;   } catch (Exception e) {   e.printStackTrace();   return false;   }   }   @Override  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {   if (qName.equals("View")){//当一个标签开始时实例化一个mItem对象   mItem = new PicControl();  }    tagStack.push(qName);   }   public List<PicControl> getResult(){   return list;   }   public void clear(){   list.clear();   }   }  

四、调用实现解析

SAXFileHandler mHandler = new SAXFileHandler();           String filename = "mnt/sdcard/test11.xml";           File file = new File(filename);           mHandler.parse(file);         list.clear();        list = mHandler.getResult();        System.out.println("第一种方式实现输出结果:" + mHandler.getResult());           mHandler.clear();  





 

 

 

原创粉丝点击