Pull解析器解析XML文件和生成XML文件

前端之家收集整理的这篇文章主要介绍了Pull解析器解析XML文件和生成XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
除了可以使用 SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
有些时候,我们需要生成一个XML文件生成XML文件方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。
  1. 1 使用代码如下(生成XML文件):
  2. 2 File xmlFile = new File("myitcast.xml");
  3. 3 FileOutputStream outStream = new FileOutputStream(xmlFile);
  4. 4 OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream,"UTF-8");
  5. 5 BufferedWriter writer = new BufferedWriter(outStreamWriter);
  6. 6 writeXML(persons,writer);
  7. 7 writer.flush();
  8. 8 writer.close();
  9. 9 如果只想得到生成xml字符串内容,可以使用StringWriter
  10. 10 StringWriter writer = new StringWriter();
  11. 11 writeXML(persons,writer);
  12. 12 String content = writer.toString();
  相关代码
  PersonService.java
  1. 1 public class PersonService {
  2. 2 private Context context;
  3. 3
  4. 4 public PersonService(Context context) {
  5. 5 this.context = context;
  6. 6 }
  7. 7
  8. 8 /**
  9. 9 * 把person.xml的输入流 解析 转化成list集合
  10. 10 * @param filename assets目录下的文件
  11. 11 * @return
  12. 12 */
  13. 13 public List<Person> getPersons(String filename){
  14. 14 AssetManager manager = context.getAssets();
  15. 15 try {
  16. 16 InputStream is = manager.open(filename);
  17. 17 //在android下使用pull解析xml文件
  18. 18 //1.获取pull解析器的实例
  19. 19 XmlPullParser parser = Xml.newPullParser();
  20. 20 //2.设置解析器的一些参数
  21. 21 parser.setInput(is,"utf-8");
  22. 22 // 获取pull解析器对应的事件类型
  23. 23 int type = parser.getEventType();
  24. 24 Person person = null;
  25. 25 List<Person> persons = new ArrayList<Person>();
  26. 26 while(type!=XmlPullParser.END_DOCUMENT){
  27. 27
  28. 28 if(type==XmlPullParser.START_TAG){
  29. 29 if("person".equals(parser.getName())){
  30. 30 person = new Person();
  31. 31 int id =Integer.parseInt( parser.getAttributeValue(0));
  32. 32 person.setId(id);
  33. 33 }else if("name".equals(parser.getName())){
  34. 34 String name = parser.nextText();
  35. 35 person.setName(name);
  36. 36 }else if("age".equals(parser.getName())){
  37. 37 int age = Integer.parseInt( parser.nextText());
  38. 38 person.setAge(age);
  39. 39 }
  40. 40 }
  41. 41 if(type==XmlPullParser.END_TAG){
  42. 42 if("person".equals(parser.getName())){
  43. 43 persons.add(person);
  44. 44 person = null;
  45. 45 }
  46. 46 }
  47. 47
  48. 48
  49. 49 type = parser.next();
  50. 50 }
  51. 51
  52. 52 return persons;
  53. 53
  54. 54
  55. 55 } catch (Exception e) {
  56. 56 e.printStackTrace();
  57. 57 Toast.makeText(context,"获取person.xml失败",Toast.LENGTH_SHORT).show();
  58. 58 return null;
  59. 59 }
  60. 60 }
  61. 61
  62. 62 /**
  63. 63 * 把persons集合里面的内容写到xml文件里面
  64. 64 * @param persons person的集合
  65. 65 * @return
  66. 66 */
  67. 67 public boolean savePersonToXml(List<Person> persons){
  68. 68 try {
  69. 69 XmlSerializer serializer = Xml.newSerializer();
  70. 70 // /sdcard/person.xml
  71. 71 // mount unmount 文件系统的权限
  72. 72 File file = new File(Environment.getExternalStorageDirectory(),"person.xml");
  73. 73 FileOutputStream fos = new FileOutputStream(file);
  74. 74 serializer.setOutput(fos,"utf-8");
  75. 75 serializer.startDocument("utf-8",true);
  76. 76 serializer.startTag(null,"persons");
  77. 77 for(Person person:persons){
  78. 78 serializer.startTag(null,"person");
  79. 79
  80. 80 serializer.attribute(null,"id",person.getId()+"");
  81. 81
  82. 82 serializer.startTag(null,"name");
  83. 83 serializer.text(person.getName());
  84. 84 serializer.endTag(null,"name");
  85. 85
  86. 86 serializer.startTag(null,"age");
  87. 87 serializer.text(person.getAge()+"");
  88. 88 serializer.endTag(null,"age");
  89. 89
  90. 90
  91. 91 serializer.endTag(null,"person");
  92. 92 }
  93. 93 serializer.endTag(null,"persons");
  94. 94 serializer.endDocument();
  95. 95 fos.flush();
  96. 96 fos.close();
  97. 97 return true;
  98. 98 } catch (Exception e) {
  99. 99 e.printStackTrace();
  100. 100 return false;
  101. 101 }
  102. 102
  103. 103
  104. 104 }
  105. 105
  106. 106 }

  MainActivity.java

  1. 1 public class MainActivity extends Activity {
  2. 2 /** Called when the activity is first created. */
  3. 3 @Override
  4. 4 public void onCreate(Bundle savedInstanceState) {
  5. 5 super.onCreate(savedInstanceState);
  6. 6 setContentView(R.layout.main);
  7. 7 TextView tv = (TextView) this.findViewById(R.id.tv);
  8. 8 PersonService service = new PersonService(this);
  9. 9 List<Person> persons = service.getPersons("person.xml");
  10. 10 StringBuffer sb = new StringBuffer();
  11. 11 for(Person person : persons){
  12. 12 String age = "年龄"+ person.getAge();
  13. 13 String name =person.getName();
  14. 14 String id = "id="+ person.getId();
  15. 15 sb.append(name +" "+ age+" "+id);
  16. 16 }
  17. 17 tv.setText( sb.toString());
  18. 18 }
  19. 19 }
注意:写到sd卡中去,需要添加以下权限
  a)如何用api写sd卡,new File(Environment.getExternalStorageDirectory(),"person.xml")最好将下面两个权限都添加
  b)直接写出sd卡的路径,/sdcard/person.xml,只需要写sd卡的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

猜你在找的XML相关文章