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();
- Sax 实现XML文件解析
- 使用SAX实现XML文件解析
- SAX实现对XML文件的解析
- xml文件解析-SAX
- sax解析xml文件
- SAX解析xml文件
- SAX解析XML文件
- SAX解析XML文件
- SAX解析XML文件
- SAX解析XML文件
- SAX解析xml文件
- SAX解析xml文件
- XML文件解析 sax
- SAX解析xml文件
- SAX解析XML文件
- SAX解析XML文件
- SAX解析XML文件
- sax 解析xml文件
- NSString与int和float的相互转换
- js计算两个时间之间天数差的实例代码
- weblogic中设置数据源的注意点
- ZOJ 2514 Generate Passwords 水
- 列出最常用的3个互联网应用,分析它们是平台产品还是现金牛产品
- Sax 实现XML文件解析
- hdu1285确定比赛名次(拓扑排序+优先队列)
- ZOJ 3168 Sort ZOJ7 水
- Struts2权威指南总结1:概述
- SVN版本控制DOS下操作
- SVN集成图形化操作界面
- redis基本操作
- 自定义Dialog步骤
- 【搜索】方向数组不如排兵布阵