Sax 实现XML文件解析
2019-04-15 14:25发布
生成海报
一、XML文件:
0
0
1
1
0
pic/bg.jpg
Pic
50
50
0.78125
0.908
2
/video
/213
/425
Cycle
Path
0
二、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,所以在反标签时不用获得其中的值
* 这里获取的值是标签之间的值如:- *********
表示星号部分的值
*/
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是什么?
* 这样写就会抛出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 tagStack = new Stack();
//当前标签
private String curTag="Root";
//实例化一个集合存储PicControl对象
private List list =null;
@Override
public void startDocument() throws SAXException
{
list = new ArrayList();
};
@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 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();
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮