import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream; import org.apache.commons.lang.StringUtils;
import org.apache.poi.util.IOUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.w3c.dom.Node;
import org.xml.sax.InputSource; /**
* IOS文件解析
*
* @author dKF63325
* @version ONIP BME V300R001 2014-6-9
* @since ONIP BME V300R001C00
*/
public class IosInfoUtils
{ public static HashMap<String, Object> getIosInfo(String filePath, String fileName) throws Exception
{
// 获得二级目录名称
String appName = getAppName(filePath); // 解析文件
HashMap<String, Object> infoMap = parseXml(filePath, appName); File file = new File(filePath);
// 文件名称
infoMap.put("fileName", file.getName());
// 文件大小
infoMap.put("fileSize", convertFileSize(file.length()));
// 文件大小(单位:字节)
infoMap.put("fileByteSize", file.length());
// 是否存在SDK
infoMap.put("isSDK", AXMLPrinter2.isExistsSdkFromIOS(filePath, appName));
// SDK版本号
infoMap.put("sdkVersion", AXMLPrinter2.getSdkVersionFromIOS(filePath, appName)); return infoMap;
} private static String getAppName(String filePath)
{
ZipFile file = null;
InputStream in = null;
String name = StringUtils.EMPTY;
try
{
in = new BufferedInputStream(new FileInputStream(filePath));
ZipInputStream zip = new ZipInputStream(in);
ZipEntry zp = null;
while ((zp = zip.getNextEntry()) != null)
{
name = zp.getName();
if (name.indexOf(".app") != -1)
{
name = name.substring(name.indexOf("Payload/")+"Payload/".length(), name.indexOf(".app") + ".app".length());
break;
}
}
}
catch (IOException e)
{
DEBUGGER.error("Failed to getAppName", e);
}
finally
{
IOUtils.closeQuietly(in);
AXMLPrinter2.closeZipFile(file);
}
return name;
} private static HashMap<String, Object> parseXml(String filePath, String projectName) throws IOException, Exception, DocumentException
{
String xml = AXMLPrinter2.getXmlFromIOS(filePath, projectName);
StringReader read = new StringReader(xml);
InputSource scource = new InputSource(read);
SAXReader sax = new SAXReader();
sax.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document root = sax.read(scource);
Element dictElement = (Element) root.selectSingleNode("//dict");
List<Element> children = filterElement(dictElement.elements());
HashMap<String, Object> infoMap = new HashMap<String, Object>();
for (int i = 0; i < children.size(); i+=2)
{
Element key = children.get(i);
Element val = children.get(i+1);
if ("array".equals(val.getName()))
{
List<Element> arrayList = filterElement(val.elements());
String values = StringUtils.EMPTY;
for (Element element : arrayList)
{
values += element.getStringValue() + ",";
}
infoMap.put(key.getStringValue(), StringUtils.removeEnd(values, ","));
} else if ("true".equals(val.getName())) {
infoMap.put(key.getStringValue(), true);
} else if ("false".equals(val.getName())) {
infoMap.put(key.getStringValue(), false);
} else {
infoMap.put(key.getStringValue(), val.getStringValue());
}
}
return infoMap;
} private static List<Element> filterElement(List<?> elements) {
List<Element> result = new ArrayList<Element>(elements.size());
for (Object object : elements)
{
Element element = (Element)object;
if (element.getNodeType() == Node.ELEMENT_NODE)
{
result.add(element);
}
}
return result;
} public static String convertFileSize(long filesize)
{
String strUnit = "Bytes";
String strAfterComma = "";
int intDivisor = 1;
if (filesize >= 1024 * 1024)
{
strUnit = "MB";
intDivisor = 1024 * 1024;
} else if (filesize >= 1024)
{
strUnit = "KB";
intDivisor = 1024;
}
if (intDivisor == 1){
return filesize + " " + strUnit;
} strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor;
if (strAfterComma.equals(""))
strAfterComma = ".0"; return filesize / intDivisor + "." + strAfterComma + " " + strUnit;
}
}

IOS 文件解析的更多相关文章

  1. iOS崩溃日志ips文件解析

    iOS崩溃日志ips文件解析  一 简介 测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下 ...

  2. iOS中解析 XML / JSON

    JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...

  3. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  4. NSObject头文件解析 / 消息机制 / Runtime解读 (一)

    NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...

  5. iOS 基础类解析 - NSString、NSMutableString

    iOS 基础类解析 - NSString 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  6. CocosStudio文件解析工具CsdAnalysis

    起因 因为工作需要,所以需要使用CocosStudio来制作界面动画什么的.做完了发现需要找里边对象的时候会有很长一串代码,感觉不是很爽.之前写OC代码的时候可以吧程序中的对象指针跟编辑器中的对象相对 ...

  7. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  8. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  9. phpcms V9 首页模板文件解析

    在了解了<phpcms V9 URL访问解析>之后,我们已经知道首页最终执行的是content模块下index控制器的init方法. 下面, 我们逐步分析过程如下: 第一.首页默认执行的是 ...

随机推荐

  1. Android数据库升级不丢失数据解决方案

    在Android开发中,sqlite至关重要,增删查改不多说,难点在于,1,并发,多个线程同时操作数据库.2,版本升级时,如果数据库表中新加了个字段,如何在不删除表的情况下顺利过渡,从而不丢失数据. ...

  2. SSH使用主机名访问

    比如说A电脑已经和B电脑实现了ssh免密码登陆!但是A电脑通过 ssh B电脑的主机名称 不行! 解决办法: 01.修改A电脑中的hosts文件    vim /etc/hosts 02.进入编辑界面 ...

  3. 【LeetCode 222_完全二叉树_遍历】Count Complete Tree Nodes

    解法一:递归 int countNodes(TreeNode* root) { if (root == NULL) ; TreeNode *pLeft = root->left; TreeNod ...

  4. vue.js 源代码学习笔记 ----- text-parse.js

    /* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' //找到 ...

  5. 未能加载文件或程序集“NPOI”或它的某一个依赖项

    自己遇到过得一个很麻瓜很耽误时间的bug,也请教了一些大神嫩是没找到解决方法 下面分享下问题和解决方法 做的是一个下载功能,本地是没问题IIS站点导出EXCEL的时候出错 我这边看不到错误信息,只能一 ...

  6. Windows与.NET Framework、数据库版本对应关系

    ================== windows XP/server 2003 (.NET Framework与 SQL Server\Oracle) 支持.NET版本:.NET Framewor ...

  7. Visual C#中的winform/webform/asp.net控件命名规范

                                                                            1.控件命名规范 类型 前缀 示例 AdRotator ...

  8. C语言使用pthread多线程编程(windows系统)二

    我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...

  9. Chrome 解决flash问题

    Chrome 无法显示使用插件的内容 Chrome 不再支持很多插件.不过网站创建者已经通过更安全的方式,将多数这类功能添加到 Chrome 中. 为什么 NPAPI 插件现在无法正常运行过去,许多插 ...

  10. POJ3662电缆

    题目:http://poj.org/problem?id=3662 二分答案.然后边权>mid的边的边权2记为1,否则记为0.找一个边权2的最短路,看dis[n]是否<=K. 别忘了不能到 ...