首页 > 代码库 > Android修改XML文件

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.     }