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

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

调用也相对比较简单:

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

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

【转】java 解析 plist文件的更多相关文章

  1. java解析xml文件并输出

    使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...

  2. 使用Java解析XML文件或XML字符串的例子

    转: 使用Java解析XML文件或XML字符串的例子 2017年09月16日 11:36:18 inter_peng 阅读数:4561 标签: JavaXML-Parserdom4j 更多 个人分类: ...

  3. [Xcode 实际操作]七、文件与数据-(8 )读取和解析Plist文件(属性列表文件)

    目录:[Swift]Xcode实际操作 本文将演示如何读取和解析Plist文件,即属性列表文件. 它是用来存储,串行化后的对象的文件. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[New File ...

  4. Java解析JSON文件的方法

    http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html java读取文件的方法 http://www.cnblogs.com/lovebread/ar ...

  5. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  6. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  7. java解析properties文件

    在自动化测试过程中,经常会有一些公用的属性要配置,以便后面给脚本使用,我们可以选择xml, excel或者json格式来存贮这些数据,但其实java本身就提供了properties类来处理proper ...

  8. ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存

    声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...

  9. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

随机推荐

  1. shell编程的一些例子4

    bash支持一维数组 1.数组定义: name= (value1,value2...valueN) value形如[[subscript]=]string [subscript]= 是可选项  如果没 ...

  2. source insight添加汇编文件.s

    (1) 做ARM嵌入式开发时,有时得整汇编代码,但在SIS里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都包含进来,默认只加了.inc和.asm后缀的, ...

  3. 【ASP.NET】从服务器端注册客户端脚本

    一.在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArray ...

  4. VBA在EXCEL中创建图形线条

    EXCEL使用了多少行: ActiveSheet.UsedRange.Rows.Count(再也不用循环到头啦) 创建线条并命名:ActiveSheet.Shapes.AddLine(x1,y1,x2 ...

  5. html页面高度不同浏览器兼容性设置

    页面需要嵌套在跨域的iframe中,而页面高度不固定,需要每个页面把自己的高度获得后,通过js通知iframe调整显示. 而页面在获得自己的高度时,发现总是比预想的大.经过参考别人的博客,发现原来是w ...

  6. jQuery滚动条插件 – jquery.slimscroll.js

    jquery.slimscroll.js插件是一个支持把内容放在一个盒子里面,固定一个高度,超出的则使用滚动.jquery.slimscroll.js不仅可以定义高度.宽度,还可以定义位置.滚动条大小 ...

  7. bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 665  Solved: 227[Sub ...

  8. [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...

  9. 嵌入式C语言不可不用的关键字

    1.static关键字 这个关键字前面也有提到,它的作用是强大的. 要对static关键字深入了解,首先需要掌握标准C程序的组成. 标准C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部 ...

  10. 杂烩:QWidget、QGraphics、QtQuick

    一说起Qt 大都会想起Qt的GUI编程,具体到某个类的话,最多的就是QWidget类及其子类了. 其实Qt中还有基于项的图形视图,具体来说QGraphicsView,QGraphicsScene,QG ...