Pull 解析xml
xmlpull方式解析xml是android开发中解析xml的推荐方式。
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。
Java实现
在这里我们使用KXML来实现解析.
KXML实现下面三个接口:
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserException;
org.xmlpull.v1.XmlPullParserFactory;
1.导入KXML包
从官网下载jar包,导入工程
2.pullXmlService.java
package com.kanbujian.xmlservice;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import com.kanbujian.model.User;
/** * 以pull的方式解析xml * * @author QT * */
public class pullXmlService {
/** * * @param is 读取网络上xml文件的输入流 * @param encode 字符编码格式 * @return 元素集合 */
public static List<User> pullXml(InputStream is,String encode) {
List<User> list = null;
User u = null;
try {
// 得到解析器工厂,通过静态方法获取一个解析工程对象的引用
XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();
// 通过解析器工厂的得到一个XmlPullParser解析器对象
XmlPullParser parser = xpf.newPullParser();
//獲得時間類型
int eventType = parser.getEventType();
// 解析器设置输入流和编码格式
// 把这一句漏了还搞个毛呀
parser.setInput(is,encode);
// while 遍历 ,只要事件类型不等于文档结束标志
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
// 如果事件类型为START_DOCUMENT,即读取文档开头
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<User>();
break;
// 元素标记开头标志
// 运用pull方式解析xml需要知道节点标签的名称
case XmlPullParser.START_TAG:
/* 如果在此處聲明 u = new User(); * 輸出 User [id=0,username=null,age=0,password=12345] * 每次循環都會新建一個對象 * */
if ("user".equals(parser.getName())) {
//衹有當標簽名稱爲user時,新建一個對象
u = new User();
int id = Integer.parseInt(parser.getAttributeValue(0));
//System.out.println("標簽名爲User ,設置ID "+id);
u.setId(id);
} else if ("username".equals(parser.getName())) {
String username = parser.nextText();// 获取该节点内容
//System.out.println("設置username "+username);
u.setUsername(username);
} else if ("age".equals(parser.getName())) {
int age = Integer.parseInt(parser.nextText());// 获取该节点内容
//System.out.println("設置age "+age);
u.setAge(age);
} else if ("password".equals(parser.getName())) {
//System.out.println("設置password");
String password = parser.nextText();// 获取该节点内容
u.setPassword(password);
}
break;
case XmlPullParser.END_TAG:
if ("user".equals(parser.getName())) {
list.add(u);
u = null;
}
break;
}
// 每次switch选择后跳转到下一标签,事件类型
eventType = parser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
System.out.println("nikan 出错了吧");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
3.User实体类
package com.kanbujian.model;
public class User {
private int id;
private String username;
private int age;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ",username=" + username + ",age=" + age
+ ",password=" + password + "]";
}
}
4.Http工具类
package com.kanbujian.http;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/** * http工具類 * @author QT * */
public class HttpUtils {
public HttpUtils() {
// TODO Auto-generated constructor stub
}
/** * 通過URL獲取輸入流 * @param path * @return */
public static InputStream getXml(String path){
InputStream is=null;
try {
URL url=new URL(path);
if(url!=null){
//獲得HttpURLConnnection
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
//設置屬性
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setRequestMethod("GET");
int code=connection.getResponseCode();
//GET請求成功
if(code==200){
is=connection.getInputStream();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return is;
}
}
5.测试类
package com.kanbujian.text;
import java.io.InputStream;
import java.util.List;
import com.kanbujian.http.HttpUtils;
import com.kanbujian.model.User;
import com.kanbujian.xmlservice.pullXmlService;
public class pullXmlTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="http://localhost:8080/jay01/user.xml";
InputStream is=HttpUtils.getXml(path);
List<User> list=pullXmlService.pullXml(is,"UTF-8");
for(User u: list){
System.out.println(u);
}
}
}