Android修改XML檔案
阿新 • • 發佈:2018-12-25
最近在專案中需要使用XML記錄資料,網上這方面的文章較少,記錄一下
使用DOM方式
/** * 追加內容到XML文件 * @param instructions * @throws ParserConfigurationException * @throws SAXException * @throws IOException * @throws TransformerException */ public void append2XML(String instructions) throws ParserConfigurationException, SAXException, IOException, TransformerException{ Long st=System.currentTimeMillis(); String time=DateUtils.getCurrLongTime(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //通過例項構建DocumentBuilder DocumentBuilder db = dbf.newDocumentBuilder(); //建立Document 解析給定的檔案 Document doc = db.parse(getInputStream()); //doc = db.newDocument(); //新增一個元素 Element eModel = doc.createElement("instructionsModel"); Element eInstructions = doc.createElement("instructions"); Element eCreatetime = doc.createElement("createtime"); Element eLastUseTime = doc.createElement("lastusetime"); //在元素中新增文字 Text textInstructions = doc.createTextNode(instructions); Text textCreatetime = doc.createTextNode(time); Text textLastUseTime = doc.createTextNode(time); eInstructions.appendChild(textInstructions); eCreatetime.appendChild(textCreatetime); eLastUseTime.appendChild(textLastUseTime); //通過Name獲取節點 第0個節點 eModel.appendChild(eInstructions); eModel.appendChild(eCreatetime); eModel.appendChild(eLastUseTime); Node book = doc.getElementsByTagName("instructionsList").item(0); book.appendChild(eModel); //新增一個屬性 //Attr attr = doc.createAttribute("aaa"); //建立工廠物件 TransformerFactory tfs = TransformerFactory.newInstance(); //建立Transformer物件 Transformer tf = tfs.newTransformer(); //將document輸出到輸出流中。 tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream(fu.getSDCardRoot() + File.separator + filePath + File.separator +"bb.xml"))); Long hastime=System.currentTimeMillis()-st; Log.i(TAG, "DOM方式耗時:"+hastime); }
使用PULL的方式
網上查了很久,好像大家一致認為PULL只能夠解析XML,不能夠對XML檔案進行修改操作
所以我想了一種非常麻煩的修改方法
1.解析原XML檔案,得到資料集合
2.將新資料插入到集合中去
3.重新生成XML
程式碼如下
1.解析XML檔案
/** * 獲取XML中所有的指令資訊 * * @param inputStream * @return * @throws XmlPullParserException * @throws IOException */ private List<Instructions> parseDateSource(InputStream inputStream) throws XmlPullParserException, IOException { Long st=System.currentTimeMillis(); List<Instructions> instructionsList = null; Instructions instructionsModel = null; XmlPullParser parse = Xml.newPullParser(); parse.setInput(inputStream, "utf-8"); int event = parse.getEventType(); while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: instructionsList = new ArrayList<Instructions>();// 初始化指令集合 break; case XmlPullParser.START_TAG: if (parse.getName().equals("instructionsModel")) { instructionsModel = new Instructions(); } if (instructionsModel != null) { if (parse.getName().equals("instructions")) { instructionsModel.setInstructions(parse.nextText()); } else if (parse.getName().equals("createtime")) { instructionsModel.setCreateTime(parse.nextText()); } else if (parse.getName().equals("lastusetime")) { instructionsModel.setLastUseTime(parse.nextText()); } } break; case XmlPullParser.END_TAG: if (parse.getName().equals("instructionsModel")) { instructionsList.add(instructionsModel); instructionsModel = null; } break; default: break; } event = parse.next();// 進入到下一個元素並觸發相應事件 } Long hastime=System.currentTimeMillis()-st; Log.i(TAG, "PULL方式解析耗時:"+hastime); return instructionsList; }
2.將資料插入到集合
/** * 將新指令新增到XML檔案中 * @param out * @param inputStream * @param instructions2 * @throws IllegalStateException * @throws IllegalArgumentException * @throws XmlPullParserException * @throws IOException */ private void append2xml(OutputStream out, List<Instructions> instructionsList, Instructions instructions2) throws IllegalArgumentException, IllegalStateException, IOException, XmlPullParserException { //避免重複記錄指令的操作 for(int i=0;i<instructionsList.size();i++){ Instructions instructions=instructionsList.get(i); if(instructions.getInstructions().equals(instructions2.getInstructions())){ instructionsList.remove(i); instructions2.setCreateTime(instructions.getCreateTime()); break; } } instructionsList.add(0, instructions2); createInstructionXml(out, instructionsList); }
3.生成新的XML檔案的方法
/***
* 根據列表生成XML檔案
* @param out
* @param instructionsList
* @throws IllegalArgumentException
* @throws IllegalStateException
* @throws IOException
*/
private void createInstructionXml(OutputStream out,
List<Instructions> instructionsList)
throws IllegalArgumentException, IllegalStateException, IOException {
// TODO Auto-generated method stub
XmlSerializer serializer = Xml.newSerializer();
// 設定檔案編碼
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "instructionsList");
for (Instructions instructions : instructionsList) {
serializer.startTag(null, "instructionsModel");
serializer.startTag(null, "instructions");
serializer.text(instructions.getInstructions());
serializer.endTag(null, "instructions");
serializer.startTag(null, "createtime");
serializer.text(instructions.getCreateTime());
serializer.endTag(null, "createtime");
serializer.startTag(null, "lastusetime");
serializer.text(instructions.getLastUseTime());
serializer.endTag(null, "lastusetime");
serializer.endTag(null, "instructionsModel");
}
serializer.endTag(null, "instructionsList");
serializer.endDocument();
out.flush();
out.close();
}