Android中解析XML文件的实践指南
作者:手机用户2502887763 | 来源:互联网 | 2024-12-15 22:53
本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。
在Android应用开发中,XML文件的解析是一项常见任务,无论是处理本地配置文件还是接收服务器数据。本文将详细介绍如何在Android中高效地解析XML文件。
### XML文件的来源
在Android应用中,XML文件可以来源于多个地方:
1. **本地XML文件**:本地XML文件通常存储在`assets`、`res/xml`或`res/raw`目录下,甚至可以在SD卡或应用的数据目录中找到。对于`res/xml`目录下的文件,可以直接通过`getXml(int id)`方法获取XML解析器对象`XmlResourceParser`,它是`XmlPullParser`的一个子类。其他位置的文件则需要先获取`InputStream`对象,再进行解析。
- **res/xml目录下**(推荐使用):
```java
XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX);
```
- **res/xml、res/raw目录下**:
```java
InputStream inputStream = this.getResources().openRawResource(R.xml.XXX);
```
- **assets文件夹下**:
```java
InputStream inputStream = getResources().getAssets().open(fileName);
```
- **应用指定目录下**(如SD卡,应用data目录等):
```java
String path = Environment.getExternalStorageDirectory().toString();
File xmlFile = new File(path + fileName);
InputStream inputStream = new FileInputStream(xmlFile);
```
2. **通过URL获取的XML文件**:在很多情况下,XML文件用于客户端与服务器之间的数据交换。例如,解析Google天气预报信息或自定义的XML数据结构。可以通过HTTP GET请求从服务器获取XML文件。
```java
public String getStringByUrl(String url) {
String outputString = "";
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
ResponseHandler respOnseHandler= new BasicResponseHandler();
try {
outputString = httpclient.execute(httpget, responseHandler);
outputString = new String(outputString.getBytes("ISO-8859-1"), "utf-8");
Log.i("HttpClientConnector", "连接成功");
} catch (Exception e) {
Log.i("HttpClientConnector", "连接失败");
e.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
return outputString;
}
```
### XML文件的解析方式
在Android中,常用的XML解析方式有DOM、SAX和PULL。DOM解析会将整个XML文件加载到内存中,适合处理较小的文件;SAX和PULL则是基于事件驱动的解析方式,更适合处理大型XML文件。
- **DOM解析**:适用于小型XML文件,但不适合移动设备,因为可能会导致内存溢出。
- **SAX和PULL解析**:基于事件驱动,适合处理大型XML文件。PULL解析器是Android内置的,使用起来更加方便。
### 实际编码中的使用
在实际编码中,主要根据事件类型来解析XML文件。以下是一个简单的PULL解析示例:
```java
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
// 初始化操作
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if (tagName.equals("XXXTAGXXX")) {
// 解析节点数据
}
break;
case XmlPullParser.END_TAG:
// 结束标签处理
break;
case XmlPullParser.END_DOCUMENT:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException | IOException e) {
e.printStackTrace();
}
```
### 运用实例
本例将解析一个包含中国省市信息的XML文件,文件结构简单明了。以下是主要代码示例:
```java
public InputStream getInputStreamFromAssets(String fileName) {
try {
InputStream inputStream = getResources().getAssets().open(fileName);
return inputStream;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public XmlResourceParser getXMLFromResXml(String fileName) {
XmlResourceParser xmlParser = null;
try {
xmlParser = this.getResources().getXml(R.xml.provinceandcity);
} catch (Exception e) {
e.printStackTrace();
}
return xmlParser;
}
public String getStringByUrl(String url) {
String outputString = "";
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
ResponseHandler respOnseHandler= new BasicResponseHandler();
try {
outputString = httpclient.execute(httpget, responseHandler);
outputString = new String(outputString.getBytes("ISO-8859-1"), "utf-8");
Log.i("HttpClientConnector", "连接成功");
} catch (Exception e) {
Log.i("HttpClientConnector", "连接失败");
e.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
return outputString;
}
public InputStream getInputStreamFromSDcard(String fileName) {
try {
String path = Environment.getExternalStorageDirectory().toString() + "/test_xml/";
File xmlFile = new File(path + fileName);
InputStream inputStream = new FileInputStream(xmlFile);
return inputStream;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void parserWhitThread() {
new Thread() {
@Override
public void run() {
provinceandcityStr = getStringByUrl(provinceAndCityUrl);
provinceArray = ProvincePullParse.Parse(provinceandcityStr);
for (Province pro : provinceArray) {
provinceStr += pro.getProvinceId() + " : " + pro.getProvinceName() + "\n";
}
isFinishParser = true;
}
}.start();
}
public static ArrayList ParseXml(XmlPullParser parser) {
ArrayList CityArray = new ArrayList<>();
City CityTemp = null;
int provinceId = 0;
int cityId;
String cityName;
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if (tagName.equals("province")) {
provinceId = Integer.parseInt(parser.getAttributeValue(0));
} else if (tagName.equals("item")) {
CityTemp = new City();
} else if (tagName.equals("id")) {
cityId = Integer.parseInt(parser.nextText());
cityName = parser.nextText();
CityTemp.setProvinceId(provinceId);
CityTemp.setCityId(cityId);
CityTemp.setCityName(cityName);
CityArray.add(CityTemp);
}
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException | IOException e) {
e.printStackTrace();
}
return CityArray;
}
```
### 下载源码
- [源码下载](http://download.csdn.net/detail/zzp16/4459459)
### 参考资料
1. [谷歌天气预报](http://android.yaohuiji.com/archives/935)
2. [Android解析XML文件的三种方式](http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html)
3. [Android APIs](http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html)
推荐阅读
-
本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ...
[详细]
蜡笔小新 2024-12-26 16:06:09
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
-
-
本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ...
[详细]
蜡笔小新 2024-12-25 19:15:51
-
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
-
本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ...
[详细]
蜡笔小新 2024-12-27 18:51:49
-
本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ...
[详细]
蜡笔小新 2024-12-27 18:20:43
-
SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ...
[详细]
蜡笔小新 2024-12-25 19:26:39
-
本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ...
[详细]
蜡笔小新 2024-12-28 11:52:00
-
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
-
本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ...
[详细]
蜡笔小新 2024-12-28 04:11:47
-
本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ...
[详细]
蜡笔小新 2024-12-27 19:31:05
-
2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ...
[详细]
蜡笔小新 2024-12-27 17:49:56
-
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
-
本文介绍如何在PHPCMS V9中创建和管理多个站点,包括配置独立域名、设置动态URL,并确保各子站能够正常运行。我们将详细讲解从新建站点到最终配置路由的每一步骤。 ...
[详细]
蜡笔小新 2024-12-27 05:15:58
-
本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ...
[详细]
蜡笔小新 2024-12-26 18:31:42
-
手机用户2502887763
这个家伙很懒,什么也没留下!