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方法. 下面, 我们逐步分析过程如下: 第一.首页默认执行的是 ...
随机推荐
- 黑暗世界的搜索引擎 https://fofa.so/ https://www.shodan.io https://www.zoomeye.org 查找设备漏洞
from:http://www.freebuf.com/sectool/121339.html 什么是 Shodan? 首先,Shodan 是一个搜索引擎,但它与 Google 这种搜索网址的搜索引擎 ...
- (C#基础)深浅拷贝理解
一方面感觉实在无趣,不知道做什么了,纯粹来个打字练习,于是有了这个. 二方面深感自己C#基础之薄弱,于是对着园友的文章一边看,一边练习,因为很多次看了,没有多久就忘了,还有练习过程中会出现一些问题,这 ...
- java Web 工程servlet中@WebServlet("/HelloServlet") 是怎么工作的
编写好Servlet之后,接下来要告诉Web容器有关于这个Servlet的一些信息.在Servlet 3.0中,可以使用标注(Annotation)来告知容器哪些Servlet会提供服务以及额外信息. ...
- JS之Iterations
for in.for of.for each in 1.for in:用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作),for ... in 循环中的代码每执行一次,就会对数组的元素或者 ...
- 几句话概括理查德成熟度模型(RESTful)
近期做的项目中准备引入RESTful风格,特地进行了一些学习,其中比较重点的有一个理查德成熟度模型(Richardson Maturity Model),模型提出了四个等级(0-3),如下图 其中只有 ...
- 词云:解决pip install wordcloud安装过程中报错“error: command 'x86_64-linux-gnu-gcc' failed with exit status 1”问题
外部环境:ubuntu16.04, 64bits, 全局环境python2.7 在虚拟环境(python3.5)中执行 pip install wordcloud 时安装失败,报错: error: c ...
- PyalgoTrade 技术组合计算(四)
可以各种技术可以组合起来.它们被建模为DataSeries.例如,在收盘价之上获得RSI以上的计算SMA,是非常简单的: from pyalgotrade import strategy from p ...
- 在SSH项目中实现分页效果
在实现分页的时候,我使用的是数据库下面的User表,实现的效果是通过分页查询 能够将表中的数据分页显示,点击相关的按钮实现:首页.上一页.下一页.末页的显示 1新建一个dynamic web proj ...
- 使TextView里面的文字滚动起来
要使TextView里面的内容滚动起来,那么就要配置好几个参数, 1.focusable来获取焦点. 2.ellipsize来获得滚动的方法. 3.focusableInTouchMode来获取触摸方 ...
- 【转载】一张表看懂LTE和5G NR的区别
转自:微信公众号:网优雇佣军 KPI 物理层