java 解析 plist文件


為了方便的將spritesheet的圖導入我自己的動畫編輯器!

我做了plist文件解析

DOM解析比較麻煩 因為element getChildNodes 會獲取到text對象。而這個對象可能是一個空白字符解析起來異常麻煩!

 

 DOM 采用建立樹形結構的方式訪問 XML 文檔,而 SAX 采用的事件模型。 

  DOM 解析器把 XML 文檔轉化為一個包含其內容的樹,並可以對樹進行遍歷。用 DOM 解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然后利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用 DOM 解析器的時候需要處理整個 XML 文檔,所以對性能和內存的要求比較高,尤其是遇到很大的 XML 文件的時候。由於它的遍歷能力,DOM 解析器常用於 XML 文檔需要頻繁的改變的服務中。 

  SAX 解析器采用了基於事件的模型,它在解析 XML 文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX 對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX 這種擴展能力得到了更好的體現。但用 SAX 解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。 

 

DOM [樹型結構] SAX [事件驅動型]

於是采用SAX解析!網上有人寫過,但存在些問題,於是自己做了修改測試!放出代碼如下:

package logame.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * .plist配置文件的解析器 
 * 
 * @author afly
 * 
 */
public class PlistHandler extends DefaultHandler {

	private boolean isRootElement = false;

	private boolean keyElementBegin = false;

	private String key;

	Stack<Object> stack = new Stack<Object>();

	private boolean valueElementBegin = false;

	private Object root;

	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getMapResult() {
		return (HashMap<String, Object>) root;
	}

	@SuppressWarnings("unchecked")
	public List<Object> getArrayResult() {
		return (List<Object>) root;
	}

	@Override
	public void startDocument() throws SAXException {
		System.out.println("開始解析");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("結束解析");
	}

	@SuppressWarnings("unchecked")
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// System.out.println(uri+"startElement:"+qName);
		if ("plist".equals(qName)) {
			isRootElement = true;
		}
		if ("dict".equals(qName)) {
			if (isRootElement) {
				stack.push(new HashMap<String, Object>());// 壓棧
				isRootElement = !isRootElement;
			} else {
				Object object = stack.peek();
				HashMap<String, Object> dict = new HashMap<String, Object>();
				if (object instanceof ArrayList)
					((ArrayList<Object>) object).add(dict);
				else if (object instanceof HashMap)
					((HashMap<String, Object>) object).put(key, dict);
				stack.push(dict);
			}
		}

		if ("key".equals(qName)) {
			keyElementBegin = true;
		}
		if ("true".equals(qName)) {
			HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();
			parent.put(key, true);
		}
		if ("false".equals(qName)) {
			HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();
			parent.put(key, false);
		}
		if ("array".equals(qName)) {
			if (isRootElement) {
				ArrayList<Object> obj = new ArrayList<Object>();
				stack.push(obj);
				isRootElement = !isRootElement;
			} else {
				HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();
				ArrayList<Object> obj = new ArrayList<Object>();
				stack.push(obj);
				parent.put(key, obj);
			}
		}
		if ("string".equals(qName)) {
			valueElementBegin = true;
		}
	}

	/*
	 * 字符串解析(non-Javadoc)
	 * 
	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.println("characters:");
		if (length > 0) {
			if (keyElementBegin) {
				key = new String(ch, start, length);
				System.out.println("key:" + key);
			}
			if (valueElementBegin) {
				if (HashMap.class.equals(stack.peek().getClass())) {
					HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();
					String value = new String(ch, start, length);
					parent.put(key, value);
				} else if (ArrayList.class.equals(stack.peek().getClass())) {
					ArrayList<Object> parent = (ArrayList<Object>) stack.peek();
					String value = new String(ch, start, length);
					parent.add(value);
				}
				System.out.println("value:" + new String(ch, start, length));
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if ("plist".equals(qName)) {
			;
		}
		if ("key".equals(qName)) {
			keyElementBegin = false;
		}
		if ("string".equals(qName)) {
			valueElementBegin = false;
		}
		if ("array".equals(qName)) {
			root = stack.pop();
		}
		if ("dict".equals(qName)) {
			root = stack.pop();
		}
	}
}

  調用相對也比較簡單

	SAXParserFactory factorys = SAXParserFactory.newInstance();
			SAXParser saxparser = factorys.newSAXParser();
			PlistHandler plistHandler = new PlistHandler();
			saxparser.parse(uri, plistHandler);

			HashMap<String, Object> hash = plistHandler.getMapResult();
			ArrayList<Object> array =  (ArrayList<Object>)plistHandler.getArrayResult();

  返回可以是一個  dict 也可以是一個array根據自己的格式獲得。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM