1. 程式人生 > >Android修改XML檔案

Android修改XML檔案

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