Android 创建与解析XML—— Pull方式

Posted jdsjlzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 创建与解析XML—— Pull方式相关的知识,希望对你有一定的参考价值。


1、Pull概述

XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser

XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中。

XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,startTag开始元素,endTag结束元素,text添加文本等。

Pull方式创建XML,应用了标准xml构造器 org.xmlpull.v1.XmlSerializer来创建 XML ,org.xmlpull.v1.XmlPullParser来解析XML,需要导入以下内容

org.xmlpull.v1

org.xmlpull.v1.XmlPullParser;

org.xmlpull.v1.XmlPullParserException;

org.xmlpull.v1.XmlPullParserFactory;

org.xmlpull.v1.XmlSerializer;

sdk源码查看路径(​​google code​​)

Pull 创建和解析 XML 的效果图:


Android


2、Pull 创建 XML

pull方式,创建xml是通过 XmlSerializer 类实现

首先,通过XmlSerializer得到创建xml的实例 xmlSerializer

接着,通过 xmlSerializer 设置输出 xmlSerializer.setOutput,xmlSerializer.startDocument("utf-8", null)设置xml属性等

然后,通过 xmlSerializer 创建 startDocument、startTag、text、endTag、endDocument等

Code


[java] 
​​view plain​​​
​​​copy​​​
​​​print​​​
​​​?​​
1. /** Pull方式,创建 XML */
2. public String pullXMLCreate()
3. new StringWriter();
4.
5. new Person[3]; // 创建节点Person对象
6. 0] = new Person(1, "sunboy_2050",");
7. 1] = new Person(2, "baidu", "http://www.baidu.com");
8. 2] = new Person(3, "google", "http://www.google.com");
9.
10. try
11. // // 方式一:使用android提供的实用工具类android.util.Xml
12. // XmlSerializer xmlSerializer = Xml.newSerializer();
13.
14. // 方式二:使用工厂类XmlPullParserFactory的方式
15. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
16. XmlSerializer xmlSerializer = factory.newSerializer();
17.
18. // 保存创建的xml
19.
20. "http://xmlpull.org/v1/doc/features.html#indent-output", true);
21. // xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " "); // 设置属性
22. // xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\\n");
23. "utf-8", null); // <?xml version=1.0 encoding=UTF-8 standalone=yes ?>
24.
25. "", "root");
26. "", "author", "homer");
27. "", "date", "2012-04-28");
28.
29. int personsLen = persons.length;
30. for(int i=0; i<personsLen; i++)
31. "", "person"); // 创建person节点
32.
33. "", "id");
34. "");
35. "", "id");
36.
37. "", "name");
38. xmlSerializer.text(persons[i].getName());
39. "", "name");
40.
41. "", "blog");
42. xmlSerializer.text(persons[i].getBlog());
43. "", "blog");
44.
45. "", "person");
46.
47.
48. "", "root");
49. xmlSerializer.endDocument();
50.
51. catch (XmlPullParserException e) // XmlPullParserFactory.newInstance
52. e.printStackTrace();
53. catch (IllegalArgumentException e) // xmlSerializer.setOutput
54. e.printStackTrace();
55. catch (IllegalStateException e) // xmlSerializer.setOutput
56. e.printStackTrace();
57. catch (IOException e) // xmlSerializer.setOutput
58. e.printStackTrace();
59. catch (Exception e)
60. e.printStackTrace();
61.
62.
63. savedXML(fileName, xmlWriter.toString());
64. return xmlWriter.toString();
65.



运行结果:



Android

3、Pull 解析 XML

pull方式,解析xml是通过 XmlPullParser 类实现

首先,通过XmlPullParser得到解析xml的实例 xpp

接着,通过 xpp设置输入 xpp.setInput(is, "utf-8"),声明定义保存xml信息的数据结构(如:Person数组)

然后,通过 xpp 解析 START_DOCUMENT、START_TAG、TEXT、END_TAG、END_DOCUMENT等

Code


[java] 
​​view plain​​​
​​​copy​​​
​​​print​​​
​​​?​​

1. /** Pull方式,解析 XML */
2. public String pullXMLResolve()
3. new StringWriter();
4.
5. InputStream is = readXML(fileName);
6. try
7. // // 方式一:使用Android提供的实用工具类android.util.Xml
8. // XmlPullParser xpp = Xml.newPullParser();
9.
10. // 方式二:使用工厂类XmlPullParserFactory的方式
11. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
12. XmlPullParser xpp = factory.newPullParser();
13.
14. "utf-8");
15.
16. null; // 保存xml的person节点
17. null;
18. null; // 保存xml头部
19. null; // Element flag
20.
21. int eventType = xpp.getEventType();
22. while(XmlPullParser.END_DOCUMENT != eventType)
23. switch (eventType)
24. case XmlPullParser.START_DOCUMENT:
25. new ArrayList<Person>(); // 初始化persons
26. new StringBuffer(); // 初始化xmlHeader
27. break;
28.
29. case XmlPullParser.START_TAG:
30. if("root".equals(xpp.getName()))
31. 0);
32. 1);
33. "root").append("\\t\\t");
34. "\\t");
35. "\\n");
36. else if("person".equals(xpp.getName()))
37. new Person(); // 创建person实例
38. else if("id".equals(xpp.getName()))
39. "id";
40. else if("name".equals(xpp.getName()))
41. "name";
42. else if("blog".equals(xpp.getName()))
43. "blog";
44. else
45. null;
46.
47. break;
48.
49. case XmlPullParser.TEXT:
50. if(null != ele)
51. if("id".equals(ele))
52. person.setId(Integer.parseInt(xpp.getText()));
53. else if("name".equals(ele))
54. person.setName(xpp.getText());
55. else if("blog".equals(ele))
56. person.setBlog(xpp.getText());
57.
58.
59. break;
60.
61. case XmlPullParser.END_TAG:
62. if("person".equals(xpp.getName()))
63. personsList.add(person);
64. null;
65.
66. null;
67. break;
68.
69.
70. // 下一个事件类型
71.
72.
73. xmlWriter.append(xmlHeader);
74. int personsLen = personsList.size();
75. for(int i=0; i<personsLen; i++)
76. xmlWriter.append(personsList.get(i).toString());
77.
78.
79. catch (XmlPullParserException e) // XmlPullParserFactory.newInstance
80. e.printStackTrace();
81. catch (Exception e)
82. e.printStackTrace();
83.
84.
85. return xmlWriter.toString();
86.




运行结果:


Android

以上是关于Android 创建与解析XML—— Pull方式的主要内容,如果未能解决你的问题,请参考以下文章

Android之解析XML格式数据

XML解析之PULL

XML解析之PULL

Android 之XML数据解析—— SAX解析

Android中三种常用解析XML的方式(DOMSAXPULL)简介及区别

android pull 解析xml文件