一、前言

首先我们先搭建一个web服务器,我这里用的是tomcat,搭建过程可参见tomacat服务器的搭建:http://blog.csdn.net/qq_28585471/article/details/77449526。然后在这个服务器下提供一段XML文本,然后,我们在这个程序里去访问这个服务器,再对得到的XML文本进行解析。


文本内容为:

我们可以在网页中输入地址预览一下:

预览成功说明tomcat成功连接,且文本设置正确。

二、 PULL解析
我们在OkHttp的项目上进行修改,布局文件不用变,修改MainActivity.java就可以

public class MainActivity extends AppCompatActivity {Button sendRequest;TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);responseText = (TextView) findViewById(R.id.response_text);sendRequest = (Button) findViewById(send_request);sendRequest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new Runnable() {@Overridepublic void run() {try{OkHttpClient client = new OkHttpClient();//将HTTP请求的地址改为http://10.0.2.2:8080/zwj/zwj.xml//模拟器是连接不到localhost的,10.0.2.2对于模拟器来说就是电脑本机的IP地址Request request = new Request.Builder().url("http://10.0.2.2:8080/zwj/zwj.xml").build();Response response = client.newCall(request).execute();String responseData = response.body().string();//得到服务器返回的数据后,调用parseXMLWithPull()方法解析服务器返回的数据parseXMLWithPull(responseData);}catch (Exception e){e.printStackTrace();}}}).start();}});}private void parseXMLWithPull(String xmlData) {try{//首先获取一个XmlPullParserFactory实例XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//借助这个XmlPullParserFactory实例得到XmlPullParser对象XmlPullParser xmlPullParser = factory.newPullParser();//调用XmlPullParser的setInput()方法将服务器返回的XML数据设置进去xmlPullParser.setInput(new StringReader(xmlData));//开始解析//通过getEventType得到当前的解析事件int eventType = xmlPullParser.getEventType();String id = "";String name = "";String version = "";//在一个while循环中不断地进行解析//如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还未完成,调用next()方法后获取下一个解析事件while (eventType != XmlPullParser.END_DOCUMENT){String nodeName = xmlPullParser.getName();switch (eventType){//开始解析某个节点case XmlPullParser.START_TAG:{if("id".equals(nodeName)){id = xmlPullParser.nextText();}else if ("name".equals(nodeName)){name = xmlPullParser.nextText();}else if ("version".equals(nodeName)){version = xmlPullParser.nextText();}break;}//完成解析某个节点case XmlPullParser.END_TAG:{if("app".equals(nodeName)){Log.d("MainActivity","id is" + id);Log.d("MainActivity","name is" + name);Log.d("MainActivity","version is" + version);}break;}default:break;}eventType = xmlPullParser.next();}}catch (Exception e){e.printStackTrace();}}

看一下打印的日志:

解析成功啦~
那就再看一下SAX解析吧!


三、SAX解析
1、首先新建个ContentHandler类继承自DefaultHandler,并重写父类的5个方法

public class ContentHandler extends DefaultHandler {private String nodeName;private StringBuilder id;private StringBuilder name;private StringBuilder version;/*** 在开始XML解析的时候调用* @throws SAXException*/@Overridepublic void startDocument() throws SAXException {id = new StringBuilder();name = new StringBuilder();version = new StringBuilder();}/*** 在开始解析某个节点的时候调用* @param uri* @param localName* @param qName* @param attributes* @throws SAXException*/@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//记录当前节点名nodeName = localName;}/*** 在获取节点内容的时候调用* @param ch* @param start* @param length* @throws SAXException*/@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {//根据当前的节点名判断内容添加到哪一个StringBulider对象中if("id".equals(nodeName)){id.append(ch,start,length);}else if("name".equals(nodeName)){name.append(ch,start,length);}else if ("version".equals(nodeName)){version.append(ch,start,length);}}/*** 在完成解析某个节点的时候调用* @param uri* @param localName* @param qName* @throws SAXException*/@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if ("app".equals(localName)){Log.d("ContentHandler","id is" + id.toString().trim());Log.d("ContentHandler","name is" + name.toString().trim());Log.d("ContentHandler","version is" + version.toString().trim());//最后要将StringBuilder清空掉id.setLength(0);name.setLength(0);version.setLength(0);}}/*** 在完成整个XML解析的时候调用* @throws SAXException*/@Overridepublic void endDocument() throws SAXException {super.endDocument();}
}

这里我们首先给id,name,version节点分别定义了一个StringBuilder对象,并在startDocument()方法里对它们进行了初始化;每当开始解析某个节点的时候,startElement()方法就会得到调用,其中localName参数记录着当前节点的名字。接着在解析节点中具体内容的时候就会调用character()方法,然后我们根据当前节点名进行判断、将解析出的内容添加到哪一个StringBuilder对象中。最后在endElement()方法中进行判断,如果app节点已经解析完成,就打印出id,name,version的内容。打印完成后,要将StringBuilder的内容清空掉。

2、修改MainActivity.java

public class MainActivity extends AppCompatActivity {Button sendRequest;TextView responseText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);responseText = (TextView) findViewById(R.id.response_text);sendRequest = (Button) findViewById(R.id.send_request);sendRequest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {new Thread(new Runnable() {@Overridepublic void run() {try{OkHttpClient client = new OkHttpClient();//将HTTP请求的地址改为http://10.0.2.2:8080/zwj/zwj.xml//模拟器是连接不到localhost的,10.0.2.2对于模拟器来说就是电脑本机的IP地址Request request = new Request.Builder().url("http://10.0.2.2:8080/zwj/zwj.xml").build();Response response = client.newCall(request).execute();String responseData = response.body().string();//得到服务器返回的数据后,调用parseXMLWithPull()方法解析服务器返回的数据parseXMLWithSAX(responseData);}catch (Exception e){e.printStackTrace();}}}).start();}});}private void parseXMLWithSAX(String xmlData) {try {SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = factory.newSAXParser().getXMLReader();ContentHandler handler = new ContentHandler();//将ContentHandler的实例设置到XMLReader中xmlReader.setContentHandler(handler);//开始执行解析xmlReader.parse(new InputSource(new StringReader(xmlData)));}catch (Exception e){e.printStackTrace();}}}

我们调用parseXMLWithSAX()方法来解析XML数据,首先创建一个SAXParserFactory对象,然后再获取到XMLReader对象,接着将ContentHandler实例设置到XMLReader中,最后调用parse()方法开始执行解析。

3、看一下logcat中的日志

和PULL解析一样的效果~~解析成功!

Android初级开发(九)——网络交互—解析XML格式数据相关推荐

  1. Android初级开发(九)——网络交互—解析JSON格式数据

    一.前言 首先还是在web服务器(我这里用的是tomcat)新建json文本 文本内容 在浏览器上预览一下 二.JSONObject方法 1.我们还是在OkHttp的基础上修改代码,布局不变 Main ...

  2. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  3. iOS开发之解析XML格式数据

    XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...

  4. php获得帮助类数据_PHP解析xml格式数据工具类示例

    本文实例讲述了PHP解析xml格式数据工具类.分享给大家供大家参考,具体如下: class ome_xml { /** * xml资源 * * @var resource * @see xml_par ...

  5. php解析xml数据格式,PHP解析xml格式数据工具类实例分享

    本文主要介绍了PHP解析xml格式数据工具类,涉及php针对xml格式数据节点添加.获取.解析等相关操作技巧,需要的朋友可以参考下,希望能帮助到大家. 本文实例讲述了PHP解析xml格式数据工具类.分 ...

  6. 解析XML格式数据实例

    前言: 网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对XML格式文件数据的解析. 实例流程: 1.创建服务器:Apache服务器(用于模拟 ...

  7. 【安卓开发 】Android初级开发(九)Android中封装View提供接口供点击事件回调的方法及使用

    自古一楼先上图 package com.example.mydialog;import android.app.Dialog; import android.content.Context; impo ...

  8. ios网络学习------8 xml格式数据的请求处理 用代码块封装

    #pragma mark 载入xml - (void)loadXML {//获取网络数据.NSLog(@"load xml");//从webserver载入数据NSString * ...

  9. Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式

    本菜鸟因为之前一直使用的是公司前辈封装好的类(网络接口调用超级方便有木有)完全没有想过有一天我会自己写,然后今天接触的时候一脸懵逼,然后今天花了一天时间终于研究好了:哈哈哈哈哈 二话不说先上代码: p ...

最新文章

  1. emacs 安装auto-complete
  2. android overridePendingTransition
  3. Scala 语言转义字符
  4. 华为交换机 查看IP和MAC对应关系
  5. define,require的基本用法
  6. Axure RP 的安装与卸载
  7. 工作原理是什么_磁翻板液位计工作原理是什么?
  8. java中使用es精准查询_使用ES简单查询语句须知
  9. 作者:刘岩(1982-),男,泰康保险集团股份有限公司数据信息中心高级工程师、高级主管,中国计算机学会会员...
  10. ConcurrentProgramming:Atomic 原子类
  11. BZOJ 2287 POJ Challenge 消失之物
  12. 不相交集java_不相交集类
  13. 微信小程序开发-新闻简讯demo
  14. TP5.1导出指定的多个日期的数据记录
  15. xshell 上传文件
  16. 莫迪:“智能城市”可协助解决城市化快速扩张挑战
  17. 仿古建筑为什么那么丑
  18. 小说作者推荐:休屠城合集
  19. java class的方法_Java Class类常用方法描述
  20. 一种高性能无锁队列设计

热门文章

  1. Linux下touch命令详解及C/C++代码实现
  2. linux中touch命令如何使用方法,Linux系统下touch命令的使用方法
  3. 2021考研英语作文石雷鹏
  4. xynuoj 1423 贪婪戈尔曼(二维费用的背包问题)
  5. jqgrid使用colModel的classes属性 实现单元格内容过长自动截取带省略号和强制换行
  6. npm publish 、 npm adduser 提示 403 的问题
  7. 机器学习还不会?精心整理的从小白到进阶教程快收下!
  8. 国内外网络安全类网站
  9. UTF-8,Unicode,GB2312编码转换(C语言)
  10. manjaro Linux上安装360浏览器的方法