最近在项目中需要使用XML记录数据,网上这方面的文章较少,记录一下

使用DOM方式

  1. /**
  2. * 追加内容到XML文档
  3. * @param instructions
  4. * @throws ParserConfigurationException
  5. * @throws SAXException
  6. * @throws IOException
  7. * @throws TransformerException
  8. */
  9. public void append2XML(String instructions) throws ParserConfigurationException, SAXException, IOException, TransformerException{
  10. Long st=System.currentTimeMillis();
  11. String time=DateUtils.getCurrLongTime();
  12. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  13. //通过实例构建DocumentBuilder
  14. DocumentBuilder db = dbf.newDocumentBuilder();
  15. //创建Document    解析给定的文件
  16. Document doc = db.parse(getInputStream());
  17. //doc = db.newDocument();
  18. //添加一个元素
  19. Element eModel = doc.createElement("instructionsModel");
  20. Element eInstructions = doc.createElement("instructions");
  21. Element eCreatetime = doc.createElement("createtime");
  22. Element eLastUseTime = doc.createElement("lastusetime");
  23. //在元素中添加文本
  24. Text textInstructions = doc.createTextNode(instructions);
  25. Text textCreatetime = doc.createTextNode(time);
  26. Text textLastUseTime = doc.createTextNode(time);
  27. eInstructions.appendChild(textInstructions);
  28. eCreatetime.appendChild(textCreatetime);
  29. eLastUseTime.appendChild(textLastUseTime);
  30. //通过Name获取节点    第0个节点
  31. eModel.appendChild(eInstructions);
  32. eModel.appendChild(eCreatetime);
  33. eModel.appendChild(eLastUseTime);
  34. Node book = doc.getElementsByTagName("instructionsList").item(0);
  35. book.appendChild(eModel);
  36. //添加一个属性
  37. //Attr attr = doc.createAttribute("aaa");
  38. //创建工厂对象
  39. TransformerFactory tfs = TransformerFactory.newInstance();
  40. //创建Transformer对象
  41. Transformer tf = tfs.newTransformer();
  42. //将document输出到输出流中。
  43. tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream(fu.getSDCardRoot() + File.separator + filePath
  44. + File.separator +"bb.xml")));
  45. Long hastime=System.currentTimeMillis()-st;
  46. Log.i(TAG, "DOM方式耗时:"+hastime);
  47. }

使用PULL的方式

网上查了很久,好像大家一致认为PULL只能够解析XML,不能够对XML文件进行修改操作

所以我想了一种非常麻烦的修改方法

1.解析原XML文件,得到数据集合

2.将新数据插入到集合中去

3.重新生成XML

代码如下

1.解析XML文件

  1. /**
  2. * 获取XML中所有的指令信息
  3. *
  4. * @param inputStream
  5. * @return
  6. * @throws XmlPullParserException
  7. * @throws IOException
  8. */
  9. private List<Instructions> parseDateSource(InputStream inputStream)
  10. throws XmlPullParserException, IOException {
  11. Long st=System.currentTimeMillis();
  12. List<Instructions> instructionsList = null;
  13. Instructions instructionsModel = null;
  14. XmlPullParser parse = Xml.newPullParser();
  15. parse.setInput(inputStream, "utf-8");
  16. int event = parse.getEventType();
  17. while (event != XmlPullParser.END_DOCUMENT) {
  18. switch (event) {
  19. case XmlPullParser.START_DOCUMENT:
  20. instructionsList = new ArrayList<Instructions>();// 初始化指令集合
  21. break;
  22. case XmlPullParser.START_TAG:
  23. if (parse.getName().equals("instructionsModel")) {
  24. instructionsModel = new Instructions();
  25. }
  26. if (instructionsModel != null) {
  27. if (parse.getName().equals("instructions")) {
  28. instructionsModel.setInstructions(parse.nextText());
  29. } else if (parse.getName().equals("createtime")) {
  30. instructionsModel.setCreateTime(parse.nextText());
  31. } else if (parse.getName().equals("lastusetime")) {
  32. instructionsModel.setLastUseTime(parse.nextText());
  33. }
  34. }
  35. break;
  36. case XmlPullParser.END_TAG:
  37. if (parse.getName().equals("instructionsModel")) {
  38. instructionsList.add(instructionsModel);
  39. instructionsModel = null;
  40. }
  41. break;
  42. default:
  43. break;
  44. }
  45. event = parse.next();// 进入到下一个元素并触发相应事件
  46. }
  47. Long hastime=System.currentTimeMillis()-st;
  48. Log.i(TAG, "PULL方式解析耗时:"+hastime);
  49. return instructionsList;
  50. }

2.将数据插入到集合

  1. /**
  2. * 将新指令添加到XML文件中
  3. * @param out
  4. * @param inputStream
  5. * @param instructions2
  6. * @throws IllegalStateException
  7. * @throws IllegalArgumentException
  8. * @throws XmlPullParserException
  9. * @throws IOException
  10. */
  11. private void append2xml(OutputStream out, List<Instructions> instructionsList,
  12. Instructions instructions2) throws IllegalArgumentException, IllegalStateException, IOException, XmlPullParserException
  13. {
  14. //避免重复记录指令的操作
  15. for(int i=0;i<instructionsList.size();i++){
  16. Instructions instructions=instructionsList.get(i);
  17. if(instructions.getInstructions().equals(instructions2.getInstructions())){
  18. instructionsList.remove(i);
  19. instructions2.setCreateTime(instructions.getCreateTime());
  20. break;
  21. }
  22. }
  23. instructionsList.add(0, instructions2);
  24. createInstructionXml(out, instructionsList);
  25. }

3.生成新的XML文件的方法

    1. /***
    2. * 根据列表生成XML文件
    3. * @param out
    4. * @param instructionsList
    5. * @throws IllegalArgumentException
    6. * @throws IllegalStateException
    7. * @throws IOException
    8. */
    9. private void createInstructionXml(OutputStream out,
    10. List<Instructions> instructionsList)
    11. throws IllegalArgumentException, IllegalStateException, IOException {
    12. // TODO Auto-generated method stub
    13. XmlSerializer serializer = Xml.newSerializer();
    14. // 设置文件编码
    15. serializer.setOutput(out, "UTF-8");
    16. serializer.startDocument("UTF-8", true);
    17. serializer.startTag(null, "instructionsList");
    18. for (Instructions instructions : instructionsList) {
    19. serializer.startTag(null, "instructionsModel");
    20. serializer.startTag(null, "instructions");
    21. serializer.text(instructions.getInstructions());
    22. serializer.endTag(null, "instructions");
    23. serializer.startTag(null, "createtime");
    24. serializer.text(instructions.getCreateTime());
    25. serializer.endTag(null, "createtime");
    26. serializer.startTag(null, "lastusetime");
    27. serializer.text(instructions.getLastUseTime());
    28. serializer.endTag(null, "lastusetime");
    29. serializer.endTag(null, "instructionsModel");
    30. }
    31. serializer.endTag(null, "instructionsList");
    32. serializer.endDocument();
    33. out.flush();
    34. out.close();
    35. }

Android修改XML文件的更多相关文章

  1. 自动帮助创建android资源xml文件的网站

    自动帮助创建android资源xml文件的网站 http://android-holo-colors.com/ stack overflow上一个seekbar的例子: http://stackove ...

  2. Android 修改host文件的3种方法

    Android修改hosts文件的方法介绍 本文介绍三种Android手机修改hosts文 件的方法,但修改hosts文件一定要谨慎:Android手机hosts文件的换行符必须是n而不是window ...

  3. 怎么在android的XML文件里加入凝视

    android的XML文件凝视一般採用 <!--凝视内容 -->的方式进行 在XML中,形如    <Button           />      的表示方式,当中&quo ...

  4. MyEclipse如何修改XML文件默认行宽

    1.MyEclipse如何修改XML文件默认行宽 Windows--->Preferences--->搜索xml--->XML--->XML Source--->Form ...

  5. MyEclipse如何修改XML文件默认打开的编辑器

    1.MyEclipse如何修改XML文件默认打开的编辑器 Windows--->Preferences--->General--->Editors--->File Associ ...

  6. Java 操纵XML之修改XML文件

    Java 操纵XML之修改XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...

  7. android 创建 xml文件

    android创建xml文件的方法. 要操作android的外部存储,所以要在AndroidManifest.xml文件中添加权限. <uses-permission android:name= ...

  8. android解析xml文件的方式

    android解析xml文件的方式   作者:东子哥 ,发布于2012-11-26,来源:博客园   在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...

  9. Java&Xml教程(七)使用JDOM修改XML文件内容

    JDOM提供了非常灵活的方式操作XML文件,使用JDOM非常简单而且代码简洁可读性强.前面我们学习了如何使用JDOM解析XML文件,本节介绍如何使用JDOM修改XML文件内容. 在这个教程中,我们准备 ...

随机推荐

  1. libvirt 命令行交互工具之virsh

    libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知libvirt大体 ...

  2. Spark on YARN的两种运行模式

    Spark on YARN有两种运行模式,如下 1.yarn-cluster:适合于生产环境.        Spark的Driver运行在ApplicationMaster中,它负责向YARN Re ...

  3. WKWebview点击图片查看大图

    大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...

  4. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  5. ViewPager的setOnPageChangeListener方法详解

    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=548173 ViewPage使用时,最关键的代码就是setOnPageChang ...

  6. XgCalendar日历插件动态添加参数

    在使用xgcalendar日历插件的时候,参数数组并非只有类型.显示时间.时区等这些参数,还可以根据extParam自定义参数扩展搜索条件,例如根据用户Id搜索不同用户的日历信息,需要将用户的Id存在 ...

  7. Java基础知识强化26:Object类之hashCode()方法、getClass()方法

    1. Object类的hashCode()方法,如下: public  int  hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...

  8. Linux内核启动分析

    张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...

  9. Topcoder SRM 648 (div.2)

    第一次做TC全部通过,截图纪念一下. 终于蓝了一次,也是TC上第一次变成蓝名,下次就要做Div.1了,希望div1不要挂零..._(:зゝ∠)_ A. KitayutaMart2 万年不变的水题. # ...

  10. ASP.NET 2.0服务器控件开发的基本概念(转载)

    利用ASP.NET 2.0技术,创建Web自定义服务器控件并不是一件轻松的事情.因为,这需要开发人员了解并能够灵活应用多种Web开发技术,例如,CSS样式表.客户端 脚本语言..NET开发语言.服务器 ...