博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pull解析器解析XML文件和生成XML文件
阅读量:4680 次
发布时间:2019-06-09

本文共 6242 字,大约阅读时间需要 20 分钟。

除了可以使用 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 使用代码如下(生成XML文件): 2 File xmlFile = new File("myitcast.xml"); 3 FileOutputStream outStream = new FileOutputStream(xmlFile); 4 OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8"); 5 BufferedWriter writer = new BufferedWriter(outStreamWriter); 6 writeXML(persons, writer); 7 writer.flush(); 8 writer.close(); 9 如果只想得到生成的xml字符串内容,可以使用StringWriter:10 StringWriter writer = new StringWriter();11 writeXML(persons, writer);12 String content = writer.toString();
   相关代码:
  PersonService.java
1 public class PersonService {  2     private Context context;  3       4     public PersonService(Context context) {  5         this.context = context;  6     }  7   8     /**  9      * 把person.xml的输入流 解析 转化成list集合  10      * @param filename  assets目录下的文件名  11      * @return 12      */ 13     public List
getPersons(String filename){ 14 AssetManager manager = context.getAssets(); 15 try { 16 InputStream is = manager.open(filename); 17 //在android下使用pull解析xml文件 18 //1.获取pull解析器的实例 19 XmlPullParser parser = Xml.newPullParser(); 20 //2.设置解析器的一些参数 21 parser.setInput(is, "utf-8"); 22 // 获取pull解析器对应的事件类型 23 int type = parser.getEventType(); 24 Person person = null; 25 List
persons = new ArrayList
(); 26 while(type!=XmlPullParser.END_DOCUMENT){ 27 28 if(type==XmlPullParser.START_TAG){ 29 if("person".equals(parser.getName())){ 30 person = new Person(); 31 int id =Integer.parseInt( parser.getAttributeValue(0)); 32 person.setId(id); 33 }else if("name".equals(parser.getName())){ 34 String name = parser.nextText(); 35 person.setName(name); 36 }else if("age".equals(parser.getName())){ 37 int age = Integer.parseInt( parser.nextText()); 38 person.setAge(age); 39 } 40 } 41 if(type==XmlPullParser.END_TAG){ 42 if("person".equals(parser.getName())){ 43 persons.add(person); 44 person = null; 45 } 46 } 47 48 49 type = parser.next(); 50 } 51 52 return persons; 53 54 55 } catch (Exception e) { 56 e.printStackTrace(); 57 Toast.makeText(context, "获取person.xml失败", Toast.LENGTH_SHORT).show(); 58 return null; 59 } 60 } 61 62 /** 63 * 把persons集合里面的内容写到xml文件里面 64 * @param persons person的集合 65 * @return 66 */ 67 public boolean savePersonToXml(List
persons){ 68 try { 69 XmlSerializer serializer = Xml.newSerializer(); 70 // /sdcard/person.xml 71 // mount unmount 文件系统的权限 72 File file = new File(Environment.getExternalStorageDirectory(),"person.xml"); 73 FileOutputStream fos = new FileOutputStream(file); 74 serializer.setOutput(fos, "utf-8"); 75 serializer.startDocument("utf-8", true); 76 serializer.startTag(null, "persons"); 77 for(Person person:persons){ 78 serializer.startTag(null, "person"); 79 80 serializer.attribute(null, "id", person.getId()+""); 81 82 serializer.startTag(null,"name"); 83 serializer.text(person.getName()); 84 serializer.endTag(null, "name"); 85 86 serializer.startTag(null,"age"); 87 serializer.text(person.getAge()+""); 88 serializer.endTag(null, "age"); 89 90 91 serializer.endTag(null, "person"); 92 } 93 serializer.endTag(null, "persons"); 94 serializer.endDocument(); 95 fos.flush(); 96 fos.close(); 97 return true; 98 } catch (Exception e) { 99 e.printStackTrace();100 return false;101 }102 103 104 }105 106 }

   MainActivity.java

1 public class MainActivity extends Activity { 2     /** Called when the activity is first created. */ 3     @Override 4     public void onCreate(Bundle savedInstanceState) { 5         super.onCreate(savedInstanceState); 6         setContentView(R.layout.main); 7         TextView tv = (TextView) this.findViewById(R.id.tv); 8         PersonService service = new PersonService(this); 9         List
persons = service.getPersons("person.xml");10 StringBuffer sb = new StringBuffer();11 for(Person person : persons){12 String age = "年龄"+ person.getAge();13 String name =person.getName();14 String id = "id="+ person.getId();15 sb.append(name +" "+ age+" "+id);16 }17 tv.setText( sb.toString());18 }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"/>

 

转载于:https://www.cnblogs.com/hacket/archive/2013/06/02/3114257.html

你可能感兴趣的文章
python--注释
查看>>
前端资源链接 ...
查看>>
yum install ntp 报错:Error: Package: ntp-4.2.6p5-25.el7.centos.2.x86_64 (base)
查看>>
leetcode-Single Number-136
查看>>
CF715C Digit Tree
查看>>
二分法练习1
查看>>
QT 制作串口调试小助手----(小白篇)
查看>>
前端MVC实践之hellorocket——by张舒彤
查看>>
OptimalSolution(2)--二叉树问题(3)Path路径问题
查看>>
IPC 之 Messenger 的使用
查看>>
爱情八十六课,等得不是爱情
查看>>
企业网站建设流程
查看>>
数据库的显示、创建、使用 、用户授权管理及忘记root用户后重置密码
查看>>
ES5和ES6中的继承 图解
查看>>
macos 下usb键盘问题.
查看>>
SQL函数学习(十六):STUFF()函数
查看>>
Apache Hadoop 和Hadoop生态圈
查看>>
Ctrl+Enter 选中文本提交
查看>>
android WIFI
查看>>
常用的匹配正则表达式和实例
查看>>