Pull 解析器:
Pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理。当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值。
Pull解析器的源码及文档下载网址:http://www.xmlpull.org/
解析步骤:
解析工具类:
解析工具类PullXml.java
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
package com.example.util;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.example.domain.City;
public class PullXml {
public List<City> pullXml() {
List<City> entities = null;
City currentCity = null;
// 1.直接创建出XmlPullParser解析对象
XmlPullParser xmlPullParser = Xml.newPullParser();
try {
// 2.设置解析文件输入流并且指定输入流在操作的编码方式
xmlPullParser.setInput(getClass().getClassLoader()
.getResourceAsStream("china.xml"), "UTF-8");
// 3.获取解析文件时返回的eventType时间类型
int eventType = xmlPullParser.getEventType();
// while循环遍历到文档结尾
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
entities = new ArrayList<City>();
break;
case XmlPullParser.END_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String name = xmlPullParser.getName();
if (name.equals("city")) {
// 声明当前的city对象
currentCity = new City();
int count = xmlPullParser.getAttributeCount();
if (count > 0) {
/*
* cityname="北京" pyName="beijing" quName="北京"
* state1="1" state2="1" stateDetailed="多云"
* tem1="30" tem2="19" windState="西北风5-6级"
*/
currentCity.setCityname(xmlPullParser
.getAttributeValue(null, "cityname"));
currentCity.setPyName(xmlPullParser
.getAttributeValue(null, "pyname"));
currentCity.setQuName(xmlPullParser
.getAttributeValue(null, "quname"));
currentCity.setState1(xmlPullParser
.getAttributeValue(null, "state1"));
currentCity.setState2(xmlPullParser
.getAttributeValue(null, "state2"));
currentCity.setStateDetailed(xmlPullParser
.getAttributeValue(null, "stateDetailed"));
currentCity.setTem1(xmlPullParser
.getAttributeValue(null, "tem1"));
currentCity.setTem2(xmlPullParser
.getAttributeValue(null, "tem2"));
currentCity.setWindState(xmlPullParser
.getAttributeValue(null, "windState"));
}
} else if (currentCity != null) {
/*
* <cityname>河南</cityname> <pyName>henan</pyName>
* <quName>河南</quName> <state1>1</state1>
* <state2>1</state2>
* <stateDetailed>多云转晴</stateDetailed> <tem1>38</tem1>
* <tem2>-1</tem2> <windState>东南风2-3级</windState>
*/
if (name.equalsIgnoreCase("cityname")) {
currentCity.setCityname(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("pyName")) {
currentCity.setPyName(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("quName")) {
currentCity.setQuName(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("state1")) {
currentCity.setState1(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("state2")) {
currentCity.setState2(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("stateDetailed")) {
currentCity.setStateDetailed(xmlPullParser
.nextText());
} else if (name.equalsIgnoreCase("tem1")) {
currentCity.setTem1(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("tem2")) {
currentCity.setTem2(xmlPullParser.nextText());
} else if (name.equalsIgnoreCase("windState")) {
currentCity.setWindState(xmlPullParser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
String names = xmlPullParser.getName();
// 在标签结束时,进行添加到集合中
if (xmlPullParser.getName().equalsIgnoreCase("city")
&& currentCity != null) {
// 添加到集合中
entities.add(currentCity);
//释放资源
currentCity = null;
}
break;
default:
break;
}
// 使用xmlPullParser.next()进入下一个元素并触发
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return entities;
}
}
二、安卓测试(转自赵雅智的博客:)
测试概念
从是否关心软件内部结构和具体实现的角度划分
黑盒测试:只关心程序执行的过程和结果白盒测试:根据源代码写测试方法或者测试用例
灰盒测试:是介于白盒测试与黑盒测试之间的
从软件开发的过程按阶段划分有
A.单元测试B.集成测试
C.确认测试
D.系统测试
E.验收测试
F.回归测试
G.Alpha测试
新建测试项目测试
新建测试项目
新建测试类
在本类创建测试类
新建测试类继承AndroidTestCase类
配置测试设备和类库
AndroidManifest.xml解析
运行测试类
一个android应用程序运行后 并不会在控制台内输出任何信息. 不能在控制台输出。但是android提供的Log类。
android.util.Log常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。按照日志级别从高到低为ERROR, WARN, INFO, DEBUG, VERBOSE.
5种日志级别的输出介绍:
1、Log.v 的输出颜色为黑色,输出大于或等于VERBOSE日志级别的信息
2、Log.d 的输出颜色为蓝色,输出大于或等于DEBUG日志级别的信息
3、Log.i 的输出为绿色,输出大于或等于INFO日志级别的信息
4、Log.w 的输出为橙色, 输出大于或等于WARN日志级别的信息
5、Log.e 的输出为红色,仅输出ERROR日志级别的信息.
在logcat中对应的log输出类型也就是上图所示
log示例
- package com.example.android_pull;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- public class MainActivity extends Activity {
- private static final String TAG = "MainActivity";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- public void logTest(View v){
- Log.v(TAG,"------------------verbose---------------------");
- Log.d(TAG,"------------------debug---------------------");
- Log.i(TAG,"------------------info---------------------");
- Log.w(TAG,"------------------warn---------------------");
- Log.e(TAG,"------------------error---------------------");
- }
- }
package com.example.android_pull;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void logTest(View v){
Log.v(TAG,"------------------verbose---------------------");
Log.d(TAG,"------------------debug---------------------");
Log.i(TAG,"------------------info---------------------");
Log.w(TAG,"------------------warn---------------------");
Log.e(TAG,"------------------error---------------------");
}
}
输出结果:
我们可以根据定义的TAG在控制台添加过过滤器