最近在項目中需要使用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 stubXmlSerializer 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();}