zoukankan      html  css  js  c++  java
  • Android修改XML文件

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

    使用DOM方式

    [java] view plaincopy
     
    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文件

    [java] view plaincopy
     
    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.将数据插入到集合

    [java] view plaincopy
     
    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文件的方法

    [java] view plaincopy
     
      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.     }  
  • 相关阅读:
    LeetCode #1021. Remove Outermost Parentheses 删除最外层的括号
    使用Maven运行测试提示Module sdk 1.5的解决方法
    Map.Entry使用详解
    c++基础(一)
    Python_正则表达式
    使用PIL生成验证码
    OpenCV_图像平滑
    OpenCV—图像阈值
    OpenCV形状变换
    使用OpenCV读写图片
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3885942.html
Copyright © 2011-2022 走看看