IOS 文件解析
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 文件解析的更多相关文章
- iOS崩溃日志ips文件解析
iOS崩溃日志ips文件解析 一 简介 测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下 ...
- iOS中解析 XML / JSON
JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...
- IOS文件操作的两种方式:NSFileManager操作和流操作
1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...
- NSObject头文件解析 / 消息机制 / Runtime解读 (一)
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...
- iOS 基础类解析 - NSString、NSMutableString
iOS 基础类解析 - NSString 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...
- CocosStudio文件解析工具CsdAnalysis
起因 因为工作需要,所以需要使用CocosStudio来制作界面动画什么的.做完了发现需要找里边对象的时候会有很长一串代码,感觉不是很爽.之前写OC代码的时候可以吧程序中的对象指针跟编辑器中的对象相对 ...
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- phpcms V9 首页模板文件解析
在了解了<phpcms V9 URL访问解析>之后,我们已经知道首页最终执行的是content模块下index控制器的init方法. 下面, 我们逐步分析过程如下: 第一.首页默认执行的是 ...
随机推荐
- windows使用git记录
1.免密码clone远程服务器代码开启ssh 生成私钥公钥 命令:查看自己配置的邮箱 git config user.name git config user.email 生成密钥:邮箱填写上面查看出 ...
- Sizzle源码分析:二 词法分析
上一篇我们了解了Sizzle的整体流程,下面我开始一点点分析各个流程,我们进行查询的第一步就是词法分析tokenize,同样先了解下思路,如果是#div_test > span input[ch ...
- Sublime 中文标题乱码
---title:Sublime 中文标题乱码--- #markdown语法(非Github Flavored) #解决办法: 在用户设置里添加一项,强制不根据 dpi 缩放dpi_scale: 1. ...
- vue: register and import
components/header-nav/menu-nav.vue <template> <div> menu nav </div> </template& ...
- 解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限
问题 由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-& ...
- Java中的HashMap的工作原理是什么?
问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...
- keras_基本网络层结构(2)_卷积层
参考文献:http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/ 卷积层 Conv1D层 keras.layers.c ...
- Jmeter-配置元件
CSV Data Set Config(CSV数据集配置) 参考:http://www.cnblogs.com/yanzhe/p/7728139.html DNS Cache Manager(DNS缓 ...
- Redis学习笔记-数据操作篇(Centos7)
一.基本操作 1.插入数据 127.0.0.1:6379> set name cos1eqlg0 OK 这样就在redis中设置了一个key-value键值对 2.查询数据 127.0.0.1: ...
- 【idea】常用快捷键
快捷键盘含义 键组合 进入一个类的实现 alt+command+B 加get,set,构造函数,重写方法 command+N 全项目关键字查找 shift+command+F 查看一个类在哪儿被依赖 ...