转换xml格式的短信记录
<?xml version="1.0" encoding="UTF-8"?>
<SMSRecord>
<SMS>
<Type>2</Type>
<Status>0</Status>
<IsRead>1</IsRead>
<Address>18712345678</Address>
<Date>2015-11-17 00:04:40</Date>
<Subject></Subject>
<Body>晚安 妞</Body>
</SMS>
<SMS>
<Type>1</Type>
<Status>0</Status>
<IsRead>1</IsRead>
<Address>18712345678</Address>
<Date>2015-11-17 00:04:01</Date>
<Subject></Subject>
<Body>(>^ω^<)还好啦,你也早睡,晚安~</Body>
</SMS>
<SMS>
<Type>2</Type>
<Status>0</Status>
<IsRead>1</IsRead>
<Address>18712345678</Address>
<Date>2015-11-17 00:03:23</Date>
<Subject></Subject>
<Body>哈哈 想名字这么高难度的事 还是交给你吧 另外 赶紧睡觉! 你今天也是累了一天了</Body>
</SMS>
</SMSRecord>
今天把手机里和老婆的短信记录导出了,是xml格式的,如上所示
type是2的表示是我自己发出去的
type是1的表示是媳妇发给我的
这种格式的看着有点费劲呀,看着不爽呀!
于是就有了下面的代码
package prac;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLReaderTest {
public static void main(String args[]) {
Element element = null;
// 可以使用绝对路劲/Practice/src/prac/
File f = new File("src/prac/Sms_QQPhoneManager(2015-11-18).xml");
// documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
DocumentBuilder db = null;
DocumentBuilderFactory dbf = null;
try {
// 返回documentBuilderFactory对象
dbf = DocumentBuilderFactory.newInstance();
// 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
db = dbf.newDocumentBuilder();
// 得到一个DOM并返回给document对象
Document dt = db.parse(f);
// 得到一个elment根元素
element = dt.getDocumentElement();
// 获得根节点
System.out.println("根元素:" + element.getNodeName());
// 获得根元素下的子节点
NodeList childNodes = element.getChildNodes();
// 遍历这些子节点
List<Msg> msgs=new ArrayList<>();
Msg msg=null;
for (int i = 0; i < childNodes.getLength(); i++) {
msg=new Msg();
// 获得每个对应位置i的结点
Node node1 = childNodes.item(i);
if ("SMS".equals(node1.getNodeName())) {
// 获得<Accounts>下的节点
NodeList nodeDetail = node1.getChildNodes();
// 遍历<Accounts>下的节点
for (int j = 0; j < nodeDetail.getLength(); j++) {
// 获得<Accounts>元素每一个节点
Node detail = nodeDetail.item(j);
if ("Type".equals(detail.getNodeName()))
{
if (detail.getTextContent().equals("2")) {
msg.setName("我");
}else {
msg.setName("老婆");
}
}
if ("Date".equals(detail.getNodeName()))
msg.setDate(detail.getTextContent());
if ("Body".equals(detail.getNodeName()))
msg.setText(detail.getTextContent());
}
msgs.add(msg);
}
}
//为什么要逆序 大家明白了么?
for (int i=msgs.size()-1;i>-1 ; i--) {
System.out.println(msgs.get(i).getName()+" "+msgs.get(i).getDate()+" "+msgs.get(i).getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Msg{
private String name;
private String date;
private String text;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
后来觉得麻烦就改成了下面这个样子:
public static void main(String args[]) {
Element element = null;
// 可以使用绝对路劲/Practice/src/prac/
File f = new File("src/prac/Sms_QQPhoneManager(2015-11-18).xml");
// documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
DocumentBuilder db = null;
DocumentBuilderFactory dbf = null;
try {
// 返回documentBuilderFactory对象
dbf = DocumentBuilderFactory.newInstance();
// 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
db = dbf.newDocumentBuilder();
// 得到一个DOM并返回给document对象
Document dt = db.parse(f);
// 得到一个elment根元素
element = dt.getDocumentElement();
// 获得根节点
System.out.println("根元素:" + element.getNodeName());
// 获得根元素下的子节点
NodeList childNodes = element.getChildNodes();
// 遍历这些子节点
List<Msg> msgs=new ArrayList<>();
Msg msg=null;
int length=childNodes.getLength();
//这length 并不是来往短信的条目数
for (int i = 0; i < length; i++) {
msg=new Msg();
// 获得每个对应位置i的结点
Node node1 = childNodes.item(i);
if ("SMS".equals(node1.getNodeName())) {
// 获得<Accounts>下的节点
NodeList nodeDetail = node1.getChildNodes();//nodeDetail里就是Type date等等
//一条短信有type body等7个字段 但是nodeDetail.getLength()并不等于7
msg.setDate(nodeDetail.item(9).getTextContent());
if (nodeDetail.item(1).getTextContent().equals("2")) {
msg.setName("我");
}else {
msg.setName("老婆");
}
msg.setText(nodeDetail.item(13).getTextContent());
msgs.add(msg);
}
}
//为什么要逆序 大家明白了么?
for (int i=msgs.size()-1;i>-1 ; i--) {
System.out.println(msgs.get(i).getName()+" "+msgs.get(i).getDate()+" "+msgs.get(i).getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果
我 2015-11-17 00:03:23 哈哈 想名字这么高难度的事 还是交给你吧 另外 赶紧睡觉! 你今天也是累了一天了 老婆 2015-11-17 00:04:01 (>^ω^<)还好啦,你也早睡,晚安~ 我 2015-11-17 00:04:40 晚安 妞
转换xml格式的短信记录的更多相关文章
- 使用jackson转换xml格式数据进行响应
最近在做微信扫码支付的功能,按照微信开发文档与支付平台进行数据交互只能使用XML格式的数据,调用别人定义的接口就需要按规则来嘛,没办法.自己之前使用jackson,主要是因为SpringMVC默认将j ...
- js 忘记密码发送短信记录cookie
<div class="forgetPwdBox" style="display:none"> <div class="forTit ...
- android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)
序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...
- 树莓派.GPRS.短信接收器
起因 曾经用过西门子出的短信猫, 好处是直接有SDK开发包, 不会硬件开发也能直接使用 缺点也是明显的, 就是只支持Windows系统, 另外就是在Windows下工作很不稳定, 隔开几天就会出现收不 ...
- Android系统应用Mms之Sms短信发送流程(Mms应用部分)二
1. 新建一条短信, 在发送短信之前, 首先创建的是一个会话Conversation, 以后所有与该接收人(一个或多个接收人)的消息交互, 都在该会话Conversation中. ComposeMes ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...
- day101:MoFang:模型构造器ModelSchema&注册功能之手机号唯一验证/保存用户注册信息/发送短信验证码
目录 1.模型构造器:ModelSchema 1.SQLAlchemySchema 2.SQLAlchemyAutoSchema 2.注册功能基本实现 1.关于手机号码的唯一性验证 2.保存用户注册信 ...
- android开发学习:打电话和发短信
1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...
- Android(java)学习笔记176:BroadcastReceiver之 短信发送的广播接收者
有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和 activity_main. ...
随机推荐
- java对redis的操作
需要两个包的支持 jedis-2.1.0.jar commons-pool-1.5.4.jar 一个连接池一个工具类 pool代码 public class RedisUtil { private s ...
- Java类加载器的工作原理
Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它. ...
- KMP及其改进算法
本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...
- 16. 3Sum Closest(中等)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- jquery插件存档
1.选择插件selectMenu github地址:https://github.com/josiaho/selectMenu 2.选择插件bootstrap_multiselect 官方地址:htt ...
- POJ 放苹果问题(递归)
首先我们想象有一个函数count f(m,n)可以把m个苹果放到n个盘子中. 根据 n 和 m 的关系可以进一步分析: 特殊的m <=1|| n <= 1时只有一种方法: 当 m < ...
- Android简易实战教程--第四十二话《Spinner下拉级联效果》
本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...
- mysql字符集,insert,update,delete,select
发现有错误:数据太长了.//查看数据库的所有编码:show variables like 'character%';-----+| character_set_client | utf8 ...
- 剑指Offer——毕业生求职网站汇总(干货)
剑指Offer--毕业生求职网站汇总(干货) 致2017即将毕业的你~ 精品网站 牛客网:https://www.nowcoder.com 赛码网:http://www.acmcoder.com/ 招 ...
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ...