转换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. ...
随机推荐
- Tomcat,eclipse热部署的三种方式
热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 怎么说呢?热部署其实用的算少了,热部署怎么说都是个人部署的,大点的公 ...
- 线性表 linear_list 顺序存储结构
可以把线性表看作一串珠子 序列:指其中的元素是有序的 注意last和length变量的内在关系 注意:将元素所占的空间和表长合并为C语言的一个结构类型 静态分配的方式,分配给一个固定大小的存储空间之后 ...
- 螺旋打印2D数组
//一破题付出血的代价 多思考!public static void offer(int [][]a){ ,right=a.length-,low=,high=a[].length-; while(l ...
- C++框架_之Qt的信号和槽的详解
C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...
- 如何去掉修改Joomla、joomlart及其模版版权、标志、图标的方法
Joomla是遵循GNU通用公共授权(GPL)的自由软件,我们虽然不推荐将Joomla的所有版权删除,但有些必要的信息还是需要修改的,下面以JoomlArt.com 的JA_teline_iii_v2 ...
- Docker 自定义网桥
除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器. 在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥. 如果服务已经运行, ...
- 从输入url到页面返回到底发生了什么
1. 前言 Google应该是开发者平日里用得最多的网站之一,今早笔者在浏览器地址栏里键入www.google.com的时候,突然想了解下这背后的网络通信过程究竟是怎么样的.毕竟自己也算是一名Web开 ...
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- 【Android】给Android Studio设置代理
先打开我们的Android Studio,点击工具栏的file下的settings,如下图 之后再搜索框上面输入Proxy,然后按第四步提示点击,如下图 之后就进入了设置代理的界面了,如下图 默认情况 ...
- Excel下拉框多列显示,如何只显示一列
小编最近接手一个项目,之于需要导数据,但是我们需要提前把表头什么的设置好,更方便其他小伙伴们帮助我们导入数据,小伙伴们都知道,在excel中设置下拉菜单很简单,直接用数据有效性-序列就可以实现,今天小 ...