现在的位置: 首页 > 综合 > 正文

Sax 实现XML文件解析

2018年06月09日 ⁄ 综合 ⁄ 共 4389字 ⁄ 字号 评论关闭

一、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();  

 

 

 

抱歉!评论已关闭.