android教程--xml解析
来源:互联网 发布:.com.cn域名好吗 编辑:程序博客网 时间:2024/04/20 04:02
android学习教材—xml解析
一、 知识概要
1、 什么是SAX
2、 SAX的基本原理
3、 SAX的常用接口
4、 SAX解析
二、 知识详解
1、 什么是SAX
a、 SAX全称Simple API for XML,既是一种接口,也是一个软件包。
b、 作为接口,SAX是事件驱动型XML解析的一个标准接口
2、 SAX的基本原理
SAX的工作原理就是对文件进行顺序的描述,扫描的过程是从开始文档(startDocument),开始元素(startEelement),标签属性(characters),结束元素(endEelement),结束文档(endDocument),一直把这个xml文件扫描完为止。如以下是一个xml文件,startDocument()是开始扫描这个文件,startEelement()开始扫描到第一个标签<resources>元素,然后扫描到<resource>,然后扫描到<mp3_name>接着characters()扫描到标签中的属性值“爱的供养.mp3”,之后endEelement()依次扫描到</mp3_name>,</resource>,</resources>,最后,endDocument()结束文件的扫描。
<?xml version="1.0" encoding="ISO-8859-1"?><resources> <resource> <mp3_name>爱的供养.mp3</mp3_name> </resource></resources>
3、 SAX的常用接口
接口:
ContentHandler(常用的接口)
ErrorHandler
DTDHandler
EntityResolver
ContentHandler的方法:
void startDocument()
void endDocument()
void startElement(String url,String localName,String qName,Attributes attributes)
void endElement(String url,String localName,String qName)
void characters(char[] ch,int start,int length)
4、SAX解析
在此src中一共有三个文件:
a、 Activity_xml.java
在此activity中得到一个按钮控件,然后为此控件设置一个监听器,在监听器方法中调用文件下载类HttpDownloader.java,然后得到下载的xml文件后就开始解析此文件,解析xml文件的4个步骤是:
l 创建SAX工厂:SAXParserFactory saxParserFactory=SAXParserFactory.newInstance;
l 创建xmlReader:XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReade();
l 为xmlReader设置内容处理器,就是调用MyContentHandler.java类:xmlReader.setContentHandler(new MyContentHandler());
l 开始解析:xmlReader.parse(new InputSource(new StringReader(url)));
package com.wyt.Activity_xml; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader; import com.wyt.downloader.HttpDownloader; import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button; public class Activity_xml extends Activity { /** Called when the activity is first created. */ private Button myButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(new getXMLlistener()); } public class getXMLlistener implements OnClickListener { public void onClick(View v) { // TODO Auto-generated method stub // 创建下载xml文件对象 HttpDownloader httpDownloader = new HttpDownloader(); try { // 调用httpDownloader()下载resources.xml文件 String url = httpDownloader .Download("http://10.0.2.2:8080/MP3/resources.xml"); System.out.println("!!!!!!!!!!"); System.out.println("@@@@@"+url); // 解析xml文件 // 1、创建SAX工厂 SAXParserFactory saxParserFactory = SAXParserFactory .newInstance(); // 2、创建xmlReader XMLReader xmlReader = saxParserFactory.newSAXParser() .getXMLReader(); // 3、为xmlReader设置内容处理文件 xmlReader.setContentHandler(new MyContentHandler()); // 4、开始解析文件 xmlReader.parse(new InputSource(new StringReader(url))); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
b、 HttpDownloader.java
package com.wyt.downloader; import java.io.BufferedReader; import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL; public class HttpDownloader{ private URL url=null; //根据url下载文件,前提是这个文件是文本文件,函数的返回值是文件中的内容 public String Download(String urlStr){ StringBuffer sb=new StringBuffer(); String line=null; BufferedReader br=null; try { //创建一个url连接 url=new URL(urlStr); //创建一个HTTP连接 HttpURLConnection hURLConn=(HttpURLConnection) url.openConnection(); //使用IO流读取数据 br=new BufferedReader(new InputStreamReader(hURLConn.getInputStream())); while((line=br.readLine())!=null){ //将这些字符添加到缓冲区的末端 sb.append(line); } //关闭流 br.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); } }c、 MyContentHandler.javapackage com.wyt.Activity_xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler { String mp3_name, mp3_size, lrc_name, lrc_size, resource; String taglib; @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("------srart-------"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("------end-------"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub taglib = localName; System.out.println("${1}quot;); if (localName.equals("resource")) { // 获取标签的全部属性 for (int i = 0; i < attributes.getLength(); i++) { System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i)); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub // 在workr标签解析完之后,会打印出所有得到的数据 taglib = ""; if (localName.equals("resource")) { this.printout(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub if (taglib.equals("mp3_name")) { mp3_name = new String(ch, start, length); } else if (taglib.equals("mp3_size")) { mp3_size = new String(ch, start, length); } else if (taglib.equals("lrc_name")) { lrc_name = new String(ch, start, length); } else if (taglib.equals("lrc_size")) { lrc_size = new String(ch, start, length); } } private void printout() { System.out.print("mp3_name"); System.out.println(mp3_name); System.out.print("mp3_size"); System.out.println(mp3_size); System.out.print("lrc_name"); System.out.println(lrc_name); System.out.print("lrc_size"); System.out.println(lrc_size); System.out.println(); }}
d、 resources.xml
<?xml version="1.0" encoding="ISO-8859-1"?><resources> <resource> <mp3_name>爱的供养.mp3</mp3_name> <mp3_size>2766528</mp3_size> <lrc_name>爱的供养.lrc</lrc_name> <lrc_size>1023</lrc_size> </resource> <resource> <mp3_name>客官不可以.mp3</mp3_name> <mp3_size>1603258</mp3_size> <lrc_name>客官不可以.lrc</lrc_name> <lrc_size>1923</lrc_size> </resource></resources>
三、 学习心得
学习这个知识点的时候,我遇到了一个很常见的问题,就是ANR,全称是Application Not Responding,当时我反复检查了我的代码,都没有错,然后我又把tomcat关掉又重启还是没有用,然后我就百度,关于这个问题的信息倒是挺多的,但是都没有说过所以然,此刻我就把下载xml文件的地址从本机地址改为10.10.2.2,没想到居然运行成功,这个我也百思不得其解,还记得上篇学习的文件下载,我就用的是本机地址,那个是OK的,但为什么这个就不成功呢,希望有知道的朋友帮我解释解释哈!!谢谢了!!
从这次我明白了写代码不要怕错,也不要怕不可以,不要被知识的框架给套住了,要跳出来思考,有句话说的对,旁观者清,或许你从另一个方向来思考就能解决问题,所以要学会从多方面来考虑问题,要尝试去试试,不试怎么会知道结果呢!!!!!
- android教程--xml解析
- Android入门进阶教程(10)-Xml解析
- SAX解析XML教程
- XML 文件解析 -- MarsChen Android 开发教程学习笔记
- boost库解析XML教程
- boost解析XML方法教程
- xml教程之java解析xml文档
- Android[中级教程]第五章 XML解析之PULL解析器
- Android[中级教程]第六章 XML解析之SAX解析器
- Android[中级教程]第七章 XML解析之Dom解析器
- Android[中级教程]第七章 XML解析之Dom解析器
- Android[中级教程]第六章 XML解析之SAX解析器
- Android[中级教程]第五章 XML解析之PULL解析器
- XML---Android中解析XML .
- XML - Android中解析XML
- android 解析XML 生成XML
- android Pull解析(XML解析)
- android XML解析
- php 调用 java webservice
- Mongodb
- 网页/脚本练习笔记
- 选择使用自动感应门的标准与必要性
- C++讨厌的临时变量什么时候产生
- android教程--xml解析
- 浅尝JQchart!
- 2.3函数与函数的重载
- awk用法小结
- 嵌入式基础总结
- Google 地图, 缩放控制, 卫星视图和地图视图
- poi 实现 java生成excel
- 算法--找出数组中出现次数超过一半的数
- 设计模式