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方法. 下面, 我们逐步分析过程如下: 第一.首页默认执行的是 ...
随机推荐
- IOS-网络(监听网络状态)
// // BWNetWorkTool.h // IOS_0131_检测网络状态 // // Created by ma c on 16/1/31. // Copyright © 2016年 博文科技 ...
- Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量
Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ...
- 处理ListView数据为空的情况
如何处理需要填充的数据为空的情况? ListView及其他继承自AdapterView的类都有一个简便的处理这种情况的方法:setEmptyView(View). 当ListView的Adapter为 ...
- C++17中那些值得关注的特性(上)
C++17标准在2017上半年已经讨论确定,正在形成ISO标准文档,今年晚些时候会正式发布.本文将介绍最新标准中值得开发者关注的新特新和基本用法. 总的来说C++17相比C++11的新特性来说新特性不 ...
- I.MX6 Android mmm convenient to use
# # 主要是记录mmm的简便自动化执行方式,为了减少键盘输入 # ]; then echo echo " Usage: ./remmm.sh <source dirctory> ...
- [QT]问题记录-QPixmap::scaled 缩放不成功
解答的帖子: http://bbs.csdn.net/topics/391850818 使用 pix.scaled(400,400) 之后需要将图片返回就可以了.
- 管道通信Pipe
通信原理: 在内存中开辟管道空间,生成管道操作对象,多个进程使用“同一个”管道对象进程操作即可实现通信 函数方法: fd1,fd2 = Pipe(duplex = True) 功能: 创建管道 参数: ...
- BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2944 Solved: 1206[Submit][Status][Discu ...
- Animation获得当前播放的第几帧
http://blog.csdn.net/cocos2der/article/details/8728443 http://www.it165.net/pro/html/201405/13204.ht ...
- elasticsearch安装入门
简介Elasticsearch是一个高度可扩展的开源的分布式Restful全文搜索和分析引擎. 它允许用户快速的( 近实时的) 存储. 搜索和分析海量数据. 它通常用作底层引擎技术, 为具有复杂搜索功 ...