最近在项目中需要使用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. CSAPP:cachelab(1)

    本项目大体上就是要求用C\C++来模拟cpu对cache的访问,然后统计hits.misses和eviction的次数.其实并没有想象中的那么难,感觉完全可以当成一道acm里面的大模拟题..下面就对这 ...

  2. Java 中 MongoDB 使用指南

    一.引入MongoDB Java Driver包 如果需要操作MongoDB的Java项目是一个Maven项目,可以在依赖中加上以下的配置. <dependencies> <depe ...

  3. Java WeakHashMap 源码解析

    前面把基于特定数据结构的Map介绍完了,它们分别利用了相应数据结构的特点来实现特殊的目的,像HashMap利用哈希表的快速插入.查找实现O(1)的增删改查,TreeMap则利用了红黑树来保证key的有 ...

  4. WebMagic开源垂直爬虫介绍

    WebMagic项目代码分为核心和扩展两部分.核心部分(webmagic-core)是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.WebMagic的架构设计参照了Scrap ...

  5. Class Prefix(Xcode6以后设置类前缀)

    点开Xcode右侧Utilities,Project Document->Class Prefix  图片:prefix.png 

  6. Oracle Dataguard三种保护模式

    Oracle Dataguard提供了三种数据保护模式,在此分别总结一下三种数据保护模式的特点. 1.最大保护模式1)这种模式提供了最高级别的数据保护能力:2)要求至少一个物理备库收到重做日志后,主库 ...

  7. 深入理解java的异常处理机制

     JAVA异常的概念    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的 ...

  8. [Angular 2] Rendering an Observable with the Async Pipe

    Angular 2 templates use a special Async pipe to be able to render out Observables. This lesson cover ...

  9. [Redux] Store Methods: getState(), dispatch(), and subscribe()

    console.clear(); const counter = (state = 0, action) => { switch (action.type) { case 'INCREMENT' ...

  10. 超好用文件对比工具 – Beyond Compare

    超好用文件对比工具 – Beyond Compare,开发中文件.目录对比神器,有了它,再也不用为找不到修改的内容而发愁了. 具备的丰富实用功能: 并列比较文件夹.FTP 网站或 Zip 文件: 为以 ...