需要有一个解析工厂,SAXParserFactory,通过解析工厂来获得解析器XMLReader,然后给解析器配置ContentHandler,最后通过parse来启动解析,其中有以下主要的方法:
startDocument:当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作。
startElement: (String namespaceURI,String localName,String qName,Attributes atts)当遇开始标签的时候就会触发这个方法。
endElement(String uri,String localName,String name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch,int start,int length):当遇到xml内容时触发这个方法,用new String(ch,start,length)可以接受内容。
下面通过一个例子来说一下,之前做的版本更新的时候用过的,通过从服务器上获取当前版本信息文件,解析后和当前软件版本号比较来判断是否有新版本发布,这里只用到下载xml文件并解析。

下载部分代码:

 1 public class HttpDownloader {       2     private URL url = null;        3     /**        4      * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容         5      * 1.创建一个URL对象        6      * 2.通过URL对象,创建一个HttpURLConnection对象 3.得到InputStram 4.从InputStream当中读取数据        7      * @param urlStr        8      * @return        9      */     10      public String download(String urlStr) {          11         StringBuffer sb = new StringBuffer();          12         String line = null;          13         BufferedReader buffer = null;          14         try {              15             // 创建一个URL对象              16             url = new URL(urlStr);              17             // 创建一个Http连接              18             HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();              19             // 使用IO流读取数据              20             buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));              21             while ((line = buffer.readLine()) != null) {                  22                 sb.append(line);              23             }          24         } catch (Exception e) {              25             e.printStackTrace();          26         } finally {              27             try {                  28                 buffer.close();              29             } catch (Exception e) {                  30                 e.printStackTrace();              31             }         32         }         33         return sb.toString();      34     }  35 }  

返回一个string对象,就是服务器上的xml文件流。接着交给ContentHandler进行解析:

 1 //xml是传进来的String值,versionInfos是保存留作回调的versionInfos对象 2 MyXMLHandler myXMLHandler = new MyXMLHandler(xml, versionInfos);   3 //解析成versionInfo对象   4 SAXParserFactory  5 saxParserFactory = SAXParserFactory.newInstance();   6 try{       7     XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();       8     xmlReader.setContentHandler(myXMLHandler);       9     xmlReader.parse(new InputSource(new StringReader(xml)));  10 }  catch(Exception e){      11     e.printStackTrace();  12 }

这里,你要传递一个版本信息对象,解析后的值都保存在这里,下面最关键的就是这个MyXMLHandler类了,它是这样的:

 1 public class VersionXMLHandler extends DefaultHandler {       2     private String xmlStr;       3     private List<VersionInfo> infos = null;       4     private VersionInfo versionInfo = null;       5     private String tagName = null;             6     /**        7      * 构造方法      8      * @param xmlStr 下载获取的xml串     9      * @param infos 回调用的infos      10      */    11     public VersionXMLHandler(String xmlStr, List<VersionInfo> infos) {        12         super();        13         this.xmlStr = xmlStr;      14         this.infos = infos;   15     }     16     public List<VersionInfo> getInfos() {        17         return infos;     18     }   19     public void setInfos(List<VersionInfo> infos) {    20         this.infos = infos;  21     }      22     @Override  23     public void characters(char[] ch, int start, int length) throws SAXException {     24         // TODO Auto-generated method stub        25         String temp = new String(ch, start, length);   26         if (tagName.equals("id")) {      27             versionInfo.setVersionId(temp);  28         } else if (tagName.equals("data")) {   29             versionInfo.setVersionData(temp);        30         } else if (tagName.equals("description")) {              31                 versionInfo.setVersionDescription(temp);          32         } else if (tagName.equals("url")) {              33                 versionInfo.setVersionUrl(temp);          34         }      35     }      36     @Override     37     public void endDocument() throws SAXException {    38         // TODO Auto-generated method stub      39     }    40     @Override  41     public void endElement(String uri, String localName, String qName) throws SAXException {         42         // TODO Auto-generated method stub        43         if (qName.equals("version")) {           44             infos.add(versionInfo);         45         }         46         tagName = "";     47     }    48     @Override  49     public void startDocument() throws SAXException {  50         // TODO Auto-generated method stub      51         super.startDocument();    52     }   53     @Override    54     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  55         // TODO Auto-generated method stub         56         this.tagName = localName;         57         if (tagName.equals("version")) {              58             versionInfo = new VersionInfo();        59         } 60     }  61 }  

它是这样工作的,首先startDocument(),这里不做什么事,只是开始了,接着会遇到startElement,当他的tagName值等于version时,会创建一个VsersionInfo对象,接着会遇到characters,对比各节点值,然后分别写入versionInfo对应的对象中,最后遇到</version>的时候,将完成的versionInfo写入List里,并设置tagName为空,留做下次用!

解析完成~~~~

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 6. Android(安卓)MultiMedia框架完全解析 - NuPlayerDriver与NuP
  3. android studio *.jar 与 *.aar 的生成与*.aar导入项目方法
  4. Camera框架初探
  5. 解决ndk编译Host 'awk' tool is outdated. Please define HOST_A
  6. android 开发 Activity 与intent
  7. 如何让android应用程序用中文显示(应用程序名称本地化)
  8. Android应用开发学习笔记之菜单
  9. android Shape Drawable美化圆角图形

随机推荐

  1. 1.3TextView
  2. 去除listView和recyclerview滑动到顶部和
  3. Android自动朗读(TTS)的实现
  4. android 下编译c++项目
  5. android 震动的api介绍
  6. Android XML布局报错:android/view/View$O
  7. android shape的使用
  8. android 使用eclipse编译 FBReaderJ流程
  9. android 入门学习笔记 检查网络连接是否
  10. Android错误之控件FloatingActionButton