Android(java)識別IOS裏plist文件

這個類用於在android裏面使用IOS中的plist文件,起初是想寫個小玩意自己看,找Json文件的時候只找到IOS中的plist文件,結果android裏面不能拿來直接用,網上找了下沒有現成可以讓我拿來直接用的,於是照着大佬們的思路寫了這麼一個工具類。目前可識別常見元素String,boolean,integer,list。

工具類


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

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

/**
 * .plist配置文件的解析器
 *
 * @author pixiaozhi
 */
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;
        }

        if ("integer".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 ("integer".equals(qName)) {
            valueElementBegin = false;
        }
        if ("array".equals(qName)) {
            root = stack.pop();
        }
        if ("dict".equals(qName)) {
            root = stack.pop();
        }
    }
}

使用

    try {
            SAXParserFactory factorys = SAXParserFactory.newInstance();
            SAXParser saxparser = factorys.newSAXParser();

			//這裏我把plist文件放到Asset下的
            InputStream is = mContext.getAssets().open("makeFriends.plist");
            PlistHandler plistHandler = new PlistHandler();
            saxparser.parse(is, plistHandler);
			//這裏我用了getArrayResult獲取,工具類裏面還有個getMapResult,視情況使用
            List<Object> array = plistHandler.getArrayResult();

			//接下來是我用fastjson將list轉成Json供自己後續使用的
            JSONArray jsonArray = (JSONArray) JSON.toJSON(array);

            for (int i = 0; i < jsonArray.size(); ++i) {
                JSONObject object = jsonArray.getJSONObject(i);
                list.add(object);
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

爲了向別人、向世界證明自己而努力拼搏,而一旦你真的取得了成績,纔會明白:人無須向別人證明什麼,只要你能超越自己。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章