通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务 器提交数据,也可以从服务器上获取数据
不过这个时候就出现了一个问题,这些数据到底 要以什么样的格式在网络上传输呢?
在网络上传输数据时最常用的格式有两种,XML和 JSON,今天先学习如何解析 XML格式的数据

在开始之前我们还需要先解决一个问题,就是从哪儿才能获取一段 XML 格式的数据?这里我准备教你搭建一个最简单的 Web服务器,在这个服务器上提供一段 XML文本, 然后我们在程序里去访问这个服务器,再对得到的 XML文本进行解析

1、首先配置apache服务器,可以看以下文章

Apache服务器的下载与安装

2、在htdocs目录下新建get_data.xml文件,文件内容如下

<?xml version="1.0"?>
<apps><app><id>1</id><name>Google Maps</name><version>1.0</version></app><app><id>2</id><name>Chrome</name><version>2.1</version></app><app><id>3</id><name>Google Play</name><version>2.3</version></app>
</apps>

ps:如果想要格式化xml文件可以查看这篇文章 [EditPlus格式化XML]
http://blog.csdn.net/u011498933/article/details/53130112

3、现在访问get_data.xml时,页面如下

既然 XML格式的数据已经提供好了,现在要做的就是从中解析出我们想要得到的那部分内容

Pull解析方式

以下代码是基于
HttpURLConnection使用这篇文章进行的修改

只修改MainActivity.java代码

 private void sendRequestWithURLConnection() {//开启线程发起网络请求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;try {URL url = new URL("http://192.168.1.51/get_data.xml");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream inputStream = connection.getInputStream();//对获取的输入流进行读取BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}parseXMLWithPull(response.toString());} catch (MalformedURLException e) {} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}private void parseXMLWithPull(String xmlData) {try {XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();xmlPullParser.setInput(new StringReader(xmlData));int eventType = xmlPullParser.getEventType();String id = "";String name = "";String version = "";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 (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

和之前文章相比有两处修改:
1、其中Url变成”http://192.168.1.51/get_data.xml“,http://192.168.1.51对于模拟器来说就是电脑本机的 IP地址,如何查看本机ip地址呢,可以参考以下文章

[查看电脑ip地址]
http://blog.csdn.net/u010356768/article/details/77744688

2、在得到了服务器返回的数据后,我们并不再去发 送一条消息,而是调用了 parseXMLWithPull()方法来解析服务器返回的数据

解释parseXMLWithPull()方法

首先要获取到一个 XmlPullParserFactory 的 实 例 , 并 借 助 这 个 实 例 得 到 XmlPullParser 对象,然后调用 XmlPullParser的 setInput()方法将服务器返回的 XML数据设置进去就可以开始解析了

解析的过程也是非常简单,通过getEventType()可以得到当前的解析事件,然后在一个 while循环 中不断地进行解析

如果当前的解析事件不等于 XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用 next()方法后可以获取下一个解析事件

在 while循环中,我们通过 getName()方法得到当前结点的名字,如果发现结点名等于 id、name或 version,就调用 nextText()方法来获取结点内具体的内容,每当解析完一个 app 结点后就将获取到的内容打印出来

观察 LogCat中的打印日志

我们已经将 XML数据中的指定内容成功解析出来了

SAX解析方式

SAX解析也是一种特别常 用的 XML解析方式,虽然它的用法比 Pull解析要复杂一些,但在语义方面会更加的清楚

通常情况下我们都会新建一个类继承自 DefaultHandler,并重写父类的五个方法,如下 所示

public class MyHandler extends DefaultHandler {@Overridepublic void startDocument() throws SAXException {super.startDocument();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {super.startElement(uri, localName, qName, attributes);}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);}@Overridepublic void endDocument() throws SAXException {super.endDocument();}
}

startDocument()方法会在开始 XML 解析的时候调用

startElement()方法会在开始解析某个结点的时候调用

characters()方法会在获取结点中内容 的时候调用

endElement()方法会在完成解析某个结点的时候调用

endDocument()方法会在 完成整个 XML解析的时候调用

其中,startElement()、characters()和 endElement()这三个方 法是有参数的,从 XML中解析出的数据就会以参数的形式传入到这些方法中。需要注意的 是,在获取结点中的内容时,characters()方法可能会被调用多次,一些换行符也被当作内容 解析出来,我们需要针对这种情况在代码中做好控制

那么下面就让我们尝试用 SAX解析的方式来实现和上一小节中同样的功能吧

MyHandler

public class MyHandler extends DefaultHandler {private String nodeName;private StringBuilder id;private StringBuilder name;private StringBuilder version;@Overridepublic void startDocument() throws SAXException {super.startDocument();id = new StringBuilder();name = new StringBuilder();version = new StringBuilder();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {super.startElement(uri, localName, qName, attributes);//记录当前节点名nodeName = localName;}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);//根据当前的结点名判断将内容添加到哪个StringBulder对象中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);}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if("app".equals(localName)){Log.d("MyHandler","id is "+id.toString().trim());Log.d("MyHandler","name is "+name.toString().trim());Log.d("MyHandler","version is "+version.toString().trim());//最后把StringBuilder清空id.setLength(0);name.setLength(0);version.setLength(0);}}@Overridepublic void endDocument() throws SAXException {super.endDocument();}
}

我们首先给 id、name和 version结点分别定义了一个 StringBuilder对象,并 在 startDocument()方法里对它们进行了初始化

每当开始解析某个结点的时候,startElement()方法就会得到调用,其中 localName参数记录着当前结点的名字,这里我们把它记录下来

接着在解析结点中具体内容的时候就会调用 characters()方法,我们会根据当前的结点名进行 判断,将解析出的内容添加到哪一个 StringBuilder对象中

最后在 endElement()方法中进行 判断,如果 app结点已经解析完成,就打印出 id、name和 version的内容

需要注意的是, 目前 id、name和 version中都可能是包括回车或换行符的,因此在打印之前我们还需要调用 一下 trim()方法,并且打印完成后还要将 StringBuilder的内容清空掉,不然的话会影响下一 次内容的读取

接下来的工作就非常简单了,修改 MainActivity中的代码,如下所示:

private void sendRequestWithURLConnection() {//开启线程发起网络请求new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;try {URL url = new URL("http://192.168.1.51/get_data.xml");connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);InputStream inputStream = connection.getInputStream();//对获取的输入流进行读取BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}parseXMLWithSAX(response.toString());} catch (MalformedURLException e) {} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}private void parseXMLWithSAX(String xmlData){SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = null;try {xmlReader = factory.newSAXParser().getXMLReader();} catch (SAXException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();}MyHandler handler = new MyHandler();//将ContentHandler的实例设置到XMLReader中xmlReader.setContentHandler(handler);//开始执行解析try {xmlReader.parse(new InputSource(new StringReader(xmlData)));} catch (IOException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}}

在得到了服务器返回的数据后,我们这次去调用 parseXMLWithSAX()方法来解析 XML 数据

parseXMLWithSAX()方法中先是创建了一个 SAXParserFactory的对象,然后再获取到 XMLReader对象,接着将我们编写的 ContentHandler的实例设置到 XMLReader中

最后调 用 parse()方法开始执行解析就好了

现在重新运行一下程序,点击 Send Request按钮后观察 LogCat中的打印日志,你会看 到和Pull方式中解析的一样的结果

解析 XML格式数据相关推荐

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

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

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

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

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

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

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

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

  5. 解析XML格式数据实例

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

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

    一.前言 首先我们先搭建一个web服务器,我这里用的是tomcat,搭建过程可参见tomacat服务器的搭建:http://blog.csdn.net/qq_28585471/article/deta ...

  7. Xml 格式数据的生成和解析

    相关阅读 XML约束 Xml 格式数据的生成和解析 XML解析器 什么是XML XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记 ...

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

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

  9. ajax请求json和xml数据及对json和xml格式数据的解析

    ajax请求json和xml数据及对json和xml格式数据的解析 一.ajax请求json数据并解析 ajax的写法: json数据解析: 请求json经常出现的跨域报错: 二.ajax请求xml数 ...

  10. java获取微信xml数据格式的文件_(5)微信二次开发 之 XML格式数据解析

    1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...

最新文章

  1. CentOS6安装nodejs
  2. Django快速开发之投票系统
  3. SourceChangeWarning:验证集上准确率很高,但是测试集上很低
  4. 吴恩达深度学习笔记12-Course4-Week3【目标检测】
  5. Atitit 知识管理的重要方法 数据来源,聚合,分类,备份,发布 搜索
  6. .Net 2.0中使用扩展方法
  7. python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
  8. wxpython使用方法_python图形界面开发之wxPython树控件使用方法详解
  9. 收集一些常用的正则表达式
  10. 我写了10年博客,却被人说“不火”?我是这样怼回去的?
  11. 恐怖logo效果展示AE模板
  12. Linux下gcc与g++用法以及编写makefile
  13. OpenCV最简JAVA版范例
  14. 感受McAfee.Secure.Internet.Gateway
  15. 如何做好工程项目管理策划书,这个范本值得参考!
  16. 中兴2618交换机的STP环网基本操作
  17. Druid 加载 Kafka 流数据的性能配置参数 TuningConfig
  18. Java基本类型介绍
  19. Fiddler抓包学习笔记
  20. Xilinx网站 – 如何申请官方IP的评估license

热门文章

  1. 计算机组成bcd码,bcd码怎么换算(8421bcd码计算器)
  2. sqlite3 表创建后设置主外键 联合主键 外键设置
  3. 微服务架构之监控预警
  4. iTunes历史各个版本下载地址
  5. 不能右键新建html文件,鼠标右键没有新建文本文档选项怎么办?
  6. 不依赖Flash浏览器插件,运行Flash的方法
  7. 集成运算放大器的简要介绍
  8. 你画我猜游戏html源代码,微信小程序你画我猜demo完整源码
  9. 汽车行业营销案例(共13份)
  10. 谷歌翻译软件-免费谷歌翻译