Pull 解析xml

前端之家收集整理的这篇文章主要介绍了Pull 解析xml前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Pull 解析xml

xmlpull方式解析xml是android开发中解析xml的推荐方式。

XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

Java实现

在这里我们使用KXML来实现解析.

  1. KXML实现下面三个接口:
  2. org.xmlpull.v1.XmlPullParser;
  3. org.xmlpull.v1.XmlPullParserException;
  4. org.xmlpull.v1.XmlPullParserFactory;

1.导入KXML包

从官网下载jar包,导入工程

2.pullXmlService.java

  1. package com.kanbujian.xmlservice;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import org.xmlpull.v1.XmlPullParser;
  9. import org.xmlpull.v1.XmlPullParserException;
  10. import org.xmlpull.v1.XmlPullParserFactory;
  11.  
  12. import com.kanbujian.model.User;
  13.  
  14. /** * 以pull的方式解析xml * * @author QT * */
  15. public class pullXmlService {
  16.  
  17. /** * * @param is 读取网络上xml文件的输入流 * @param encode 字符编码格式 * @return 元素集合 */
  18. public static List<User> pullXml(InputStream is,String encode) {
  19. List<User> list = null;
  20. User u = null;
  21.  
  22. try {
  23. // 得到解析器工厂,通过静态方法获取一个解析工程对象的引用
  24. XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();
  25. // 通过解析器工厂的得到一个XmlPullParser解析器对象
  26. XmlPullParser parser = xpf.newPullParser();
  27. //獲得時間類型
  28. int eventType = parser.getEventType();
  29.  
  30. // 解析器设置输入流和编码格式
  31. // 把这一句漏了还搞个毛呀
  32. parser.setInput(is,encode);
  33.  
  34. // while 遍历 ,只要事件类型不等于文档结束标志
  35. while (eventType != XmlPullParser.END_DOCUMENT) {
  36.  
  37. switch (eventType) {
  38. // 如果事件类型为START_DOCUMENT,即读取文档开头
  39. case XmlPullParser.START_DOCUMENT:
  40.  
  41. list = new ArrayList<User>();
  42.  
  43. break;
  44. // 元素标记开头标志
  45. // 运用pull方式解析xml需要知道节点标签名称
  46. case XmlPullParser.START_TAG:
  47. /* 如果在此處聲明 u = new User(); * 輸出 User [id=0,username=null,age=0,password=12345] * 每次循環都會新建一個對象 * */
  48.  
  49. if ("user".equals(parser.getName())) {
  50. //衹有當標簽名稱爲user時,新建一個對象
  51. u = new User();
  52. int id = Integer.parseInt(parser.getAttributeValue(0));
  53. //System.out.println("標簽名爲User ,設置ID "+id);
  54. u.setId(id);
  55. } else if ("username".equals(parser.getName())) {
  56.  
  57. String username = parser.nextText();// 获取该节点内容
  58. //System.out.println("設置username "+username);
  59. u.setUsername(username);
  60. } else if ("age".equals(parser.getName())) {
  61.  
  62. int age = Integer.parseInt(parser.nextText());// 获取该节点内容
  63. //System.out.println("設置age "+age);
  64. u.setAge(age);
  65. } else if ("password".equals(parser.getName())) {
  66. //System.out.println("設置password");
  67. String password = parser.nextText();// 获取该节点内容
  68. u.setPassword(password);
  69. }
  70.  
  71. break;
  72.  
  73. case XmlPullParser.END_TAG:
  74. if ("user".equals(parser.getName())) {
  75.  
  76. list.add(u);
  77. u = null;
  78.  
  79. }
  80.  
  81. break;
  82.  
  83. }
  84. // 每次switch选择后跳转到下一标签,事件类型
  85. eventType = parser.next();
  86. }
  87.  
  88. } catch (XmlPullParserException e) {
  89. // TODO Auto-generated catch block
  90. System.out.println("nikan 出错了吧");
  91. e.printStackTrace();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95.  
  96. return list;
  97. }
  98.  
  99. }

3.User实体类

  1. package com.kanbujian.model;
  2.  
  3. public class User {
  4. private int id;
  5. private String username;
  6. private int age;
  7. private String password;
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20. public int getAge() {
  21. return age;
  22. }
  23. public void setAge(int age) {
  24. this.age = age;
  25. }
  26. public String getPassword() {
  27. return password;
  28. }
  29. public void setPassword(String password) {
  30. this.password = password;
  31. }
  32. @Override
  33. public String toString() {
  34. return "User [id=" + id + ",username=" + username + ",age=" + age
  35. + ",password=" + password + "]";
  36. }
  37.  
  38.  
  39. }

4.Http工具类

  1. package com.kanbujian.http;
  2.  
  3. import java.io.InputStream;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. /** * http工具類 * @author QT * */
  7. public class HttpUtils {
  8. public HttpUtils() {
  9. // TODO Auto-generated constructor stub
  10. }
  11. /** * 通過URL獲取輸入流 * @param path * @return */
  12. public static InputStream getXml(String path){
  13. InputStream is=null;
  14. try {
  15. URL url=new URL(path);
  16. if(url!=null){
  17. //獲得HttpURLConnnection
  18. HttpURLConnection connection =(HttpURLConnection)url.openConnection();
  19. //設置屬性
  20. connection.setConnectTimeout(3000);
  21. connection.setDoInput(true);
  22. connection.setRequestMethod("GET");
  23. int code=connection.getResponseCode();
  24. //GET請求成功
  25. if(code==200){
  26. is=connection.getInputStream();
  27. }
  28. }
  29.  
  30. } catch (Exception e) {
  31. // TODO: handle exception
  32. }
  33. return is;
  34.  
  35. }
  36. }

5.测试类

  1. package com.kanbujian.text;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5.  
  6. import com.kanbujian.http.HttpUtils;
  7. import com.kanbujian.model.User;
  8. import com.kanbujian.xmlservice.pullXmlService;
  9.  
  10. public class pullXmlTest {
  11.  
  12. public static void main(String[] args) {
  13. // TODO Auto-generated method stub
  14. String path="http://localhost:8080/jay01/user.xml";
  15.  
  16. InputStream is=HttpUtils.getXml(path);
  17.  
  18. List<User> list=pullXmlService.pullXml(is,"UTF-8");
  19.  
  20. for(User u: list){
  21. System.out.println(u);
  22. }
  23.  
  24. }
  25.  
  26. }

6.xml文件内容及运行结果

猜你在找的XML相关文章