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);
- }
-
- }
-
- }