博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】java 解析 plist文件
阅读量:5291 次
发布时间:2019-06-14

本文共 4636 字,大约阅读时间需要 15 分钟。

为了方便的将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解析!网上有人写过,但存在些问题,于是自己做了修改测试!放出代码如下:

 

[java] 
 
  1. package logame.core;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Stack;  
  9.   
  10. import org.xml.sax.Attributes;  
  11. import org.xml.sax.SAXException;  
  12. import org.xml.sax.helpers.DefaultHandler;  
  13.   
  14. /** 
  15.  * .plist配置文件的解析器  
  16.  *  
  17.  * @author afly 
  18.  *  
  19.  */  
  20. public class PlistHandler extends DefaultHandler {  
  21.   
  22.     private boolean isRootElement = false;  
  23.   
  24.     private boolean keyElementBegin = false;  
  25.   
  26.     private String key;  
  27.   
  28.     Stack<Object> stack = new Stack<Object>();  
  29.   
  30.     private boolean valueElementBegin = false;  
  31.   
  32.     private Object root;  
  33.   
  34.     @SuppressWarnings("unchecked")  
  35.     public HashMap<String, Object> getMapResult() {  
  36.         return (HashMap<String, Object>) root;  
  37.     }  
  38.   
  39.     @SuppressWarnings("unchecked")  
  40.     public List<Object> getArrayResult() {  
  41.         return (List<Object>) root;  
  42.     }  
  43.   
  44.     @Override  
  45.     public void startDocument() throws SAXException {  
  46.         System.out.println("开始解析");  
  47.     }  
  48.   
  49.     @Override  
  50.     public void endDocument() throws SAXException {  
  51.         System.out.println("结束解析");  
  52.     }  
  53.   
  54.     @SuppressWarnings("unchecked")  
  55.     @Override  
  56.     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
  57.         // System.out.println(uri+"startElement:"+qName);  
  58.         if ("plist".equals(qName)) {  
  59.             isRootElement = true;  
  60.         }  
  61.         if ("dict".equals(qName)) {  
  62.             if (isRootElement) {  
  63.                 stack.push(new HashMap<String, Object>());// 压栈  
  64.                 isRootElement = !isRootElement;  
  65.             } else {  
  66.                 Object object = stack.peek();  
  67.                 HashMap<String, Object> dict = new HashMap<String, Object>();  
  68.                 if (object instanceof ArrayList)  
  69.                     ((ArrayList<Object>) object).add(dict);  
  70.                 else if (object instanceof HashMap)  
  71.                     ((HashMap<String, Object>) object).put(key, dict);  
  72.                 stack.push(dict);  
  73.             }  
  74.         }  
  75.   
  76.         if ("key".equals(qName)) {  
  77.             keyElementBegin = true;  
  78.         }  
  79.         if ("true".equals(qName)) {  
  80.             HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();  
  81.             parent.put(key, true);  
  82.         }  
  83.         if ("false".equals(qName)) {  
  84.             HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();  
  85.             parent.put(key, false);  
  86.         }  
  87.         if ("array".equals(qName)) {  
  88.             if (isRootElement) {  
  89.                 ArrayList<Object> obj = new ArrayList<Object>();  
  90.                 stack.push(obj);  
  91.                 isRootElement = !isRootElement;  
  92.             } else {  
  93.                 HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();  
  94.                 ArrayList<Object> obj = new ArrayList<Object>();  
  95.                 stack.push(obj);  
  96.                 parent.put(key, obj);  
  97.             }  
  98.         }  
  99.         if ("string".equals(qName)) {  
  100.             valueElementBegin = true;  
  101.         }  
  102.     }  
  103.   
  104.     /* 
  105.      * 字符串解析(non-Javadoc) 
  106.      *  
  107.      * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) 
  108.      */  
  109.     @SuppressWarnings("unchecked")  
  110.     @Override  
  111.     public void characters(char[] ch, int start, int length) throws SAXException {  
  112.         System.out.println("characters:");  
  113.         if (length > 0) {  
  114.             if (keyElementBegin) {  
  115.                 key = new String(ch, start, length);  
  116.                 System.out.println("key:" + key);  
  117.             }  
  118.             if (valueElementBegin) {  
  119.                 if (HashMap.class.equals(stack.peek().getClass())) {  
  120.                     HashMap<String, Object> parent = (HashMap<String, Object>) stack.peek();  
  121.                     String value = new String(ch, start, length);  
  122.                     parent.put(key, value);  
  123.                 } else if (ArrayList.class.equals(stack.peek().getClass())) {  
  124.                     ArrayList<Object> parent = (ArrayList<Object>) stack.peek();  
  125.                     String value = new String(ch, start, length);  
  126.                     parent.add(value);  
  127.                 }  
  128.                 System.out.println("value:" + new String(ch, start, length));  
  129.             }  
  130.         }  
  131.     }  
  132.   
  133.     @Override  
  134.     public void endElement(String uri, String localName, String qName) throws SAXException {  
  135.         if ("plist".equals(qName)) {  
  136.             ;  
  137.         }  
  138.         if ("key".equals(qName)) {  
  139.             keyElementBegin = false;  
  140.         }  
  141.         if ("string".equals(qName)) {  
  142.             valueElementBegin = false;  
  143.         }  
  144.         if ("array".equals(qName)) {  
  145.             root = stack.pop();  
  146.         }  
  147.         if ("dict".equals(qName)) {  
  148.             root = stack.pop();  
  149.         }  
  150.     }  
  151. }  

调用也相对比较简单:

[java] 
 
  1. SAXParserFactory factorys = SAXParserFactory.newInstance();  
  2. SAXParser saxparser = factorys.newSAXParser();  
  3. PlistHandler plistHandler = new PlistHandler();  
  4. saxparser.parse(uri, plistHandler);  
  5.   
  6. HashMap<String, Object> hash = plistHandler.getMapResult();  
  7. ArrayList<Object> array =  (ArrayList<Object>)plistHandler.getArrayResult();  

返回可以是一个  dict 也可以是一个array根据自己的格式获得。

转载于:https://www.cnblogs.com/exmyth/p/5007813.html

你可能感兴趣的文章
HDOJ 4749 Parade Show
查看>>
python 多线程并发threading & 任务队列Queue
查看>>
【黑马程序员】资深程序员的见解
查看>>
1_fbauto
查看>>
IO体系、集合体系、多线程、jdbc
查看>>
关于时间:UTC/GMT/xST/ xDT
查看>>
[51Nod1089] 最长回文子串 V2(Manacher算法)
查看>>
Asp.Net生命周期系列六
查看>>
php引用 =& 详解
查看>>
Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)
查看>>
POJ 3009: Curling 2.0
查看>>
DLNA介绍(包含UPnP,2011/6/20 更新)
查看>>
ANGULARJS5从0开始(2) - 整合bootstrap和font-awesome
查看>>
Android 使用Parcelable序列化对象
查看>>
Python Web框架Django (零)
查看>>
Foxmail出现 错误信息:553 mailbox not found怎么解决
查看>>
spring_远程调用
查看>>
js 中基本数据类型和引用数据类型 ,,,, js中对象和函数的关系
查看>>
登录服务器,首先用到的5个命令
查看>>
多米诺骨牌
查看>>