SAX解析XML文件
程序员文章站
2022-03-03 15:06:06
...
一、SAX解析的优点
SAX解析是逐行解析XML,占用内存小,效率高,速度快,接下来通过一个小demo演示如何去通过sax解析xml
二、SAX解析流程
-
确定要解析的xml
<?xml version="1.0" encoding="utf-8"?> <books xmlns:pre="www.fmerLin.com"> <pre:book id=01> <name>tianlongbabu</name> <version>23</version> <time>1991</time> </pre:book> <pre:book id=02> <name>shendiaoxianv</name> <version>24</version> <time>1994</time> </pre:book> </books>
-
我们首先自定义类去继承Android为我们停供的ContextHandler接口的实现类DefaultHandler,以便我们能选择性实现我们需要的方法
ContextHandler接口常用方法解析
startDocument() :读取文档开头时调用,可在此方法中进行预处理操作,比如:初始化bean类,或者容器
endDocument() : 读取文档结束时调用,在此方法中进行结尾工作
startElement() : 开始标签时触发
endElment() : 结束标签时触发
-
characters() : 处理文件中读取到内容,即标签间内容,注意:标签后的空格及tab键也会被读取到。
[图片上传失败...(image-db70cf-1528682444659)]public class MyHandler extends DefaultHandler {
private String TAG="MyHandler";
private String preTag ;//标志解析到哪一个节点
private List<BooksBean> booksDatas;
private BooksBean book;
private List<BooksBean> getBooks(){
return booksDatas;
}@Override public void startDocument() throws SAXException { Log.d(TAG, "startDocument--开始解析"); booksDatas = new ArrayList<BooksBean>(); } /* uri: 命名空间 localName: 不带命名空间的标签前缀名 qName: 带命名空间的标签前缀名 attributes: 属性集合 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("books".equals(localName)){ book = new BooksBean(); book.setId(attributes.getValue("id")); } preTag=localName; Log.d(TAG,"loaclName="+localName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(book!=null){ String data = new String(ch, start, length); if("name".equals(preTag)){ book.setName(data); }else if("version".equals(preTag)){ book.setVersion(data); }else if("time".equals(preTag)){ book.setTime(data); } } Log.d(TAG, "DATA="+new String(ch, start, length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("book".equals(localName)&&book!=null){ booksDatas.add(book); book=null; } preTag=null; Log.d(TAG, "localName="+localName); } @Override public void endDocument() throws SAXException { LogUtils.d(TAG, "endDocument--结束解析"); }
}
-
建立要解析文本的bean类
public class BooksBean { private String id; private String name; private String time; private String version; public String getVersion(){ return version; } public void setVersion(String version){ this.version=version; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } }
-
开始使用我们的SAX解析
public List<BooksBean> doSAXParser(InputStream is) throws Exception{ SAXParserFactory saxParserF = SAXParserFactory.newInstance(); SAXParser saxParser = saxParserF.newSAXParser(); MyHandler dh = new MyHandler(); saxParser.parse(is, dh); is.close(); return dh.getBooks(); }
下一篇: jQuery UI 1.7发布