<?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>(&gt;^ω^&lt;)还好啦,你也早睡,晚安~</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格式的短信记录的更多相关文章

  1. 使用jackson转换xml格式数据进行响应

    最近在做微信扫码支付的功能,按照微信开发文档与支付平台进行数据交互只能使用XML格式的数据,调用别人定义的接口就需要按规则来嘛,没办法.自己之前使用jackson,主要是因为SpringMVC默认将j ...

  2. js 忘记密码发送短信记录cookie

    <div class="forgetPwdBox" style="display:none"> <div class="forTit ...

  3. android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)

    序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...

  4. 树莓派.GPRS.短信接收器

    起因 曾经用过西门子出的短信猫, 好处是直接有SDK开发包, 不会硬件开发也能直接使用 缺点也是明显的, 就是只支持Windows系统, 另外就是在Windows下工作很不稳定, 隔开几天就会出现收不 ...

  5. Android系统应用Mms之Sms短信发送流程(Mms应用部分)二

    1. 新建一条短信, 在发送短信之前, 首先创建的是一个会话Conversation, 以后所有与该接收人(一个或多个接收人)的消息交互, 都在该会话Conversation中. ComposeMes ...

  6. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...

  7. day101:MoFang:模型构造器ModelSchema&注册功能之手机号唯一验证/保存用户注册信息/发送短信验证码

    目录 1.模型构造器:ModelSchema 1.SQLAlchemySchema 2.SQLAlchemyAutoSchema 2.注册功能基本实现 1.关于手机号码的唯一性验证 2.保存用户注册信 ...

  8. android开发学习:打电话和发短信

    1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...

  9. Android(java)学习笔记176:BroadcastReceiver之 短信发送的广播接收者

    有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和  activity_main. ...

随机推荐

  1. EF实体的部分更新

    实现实体的部分更新假设实体InfoHotel如下: public class InfoHotel { public int Id{get;set;} public string Name{get;se ...

  2. WMI远程启动软件(某个应用程序)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.M ...

  3. 深入了解Java虚拟机和内存管理

    1.java程序的执行过程      java源文件->解析器->class文件->java类加载器->java运行时数据区->执行引擎 2.我们接下来看一下java运行 ...

  4. ng-book札记——路由

    路由的作用是分隔应用为不同的区块,每个区块基于匹配当前URL的规则. 路由可以分为服务端与客户端两种,服务端以Express.js为例: var express = require('express' ...

  5. 毕业论文内容框架指导-适用于MIS系统

    摘要: 背景.要做什么.选用什么技术.按照什么过程.原理.或者步骤去做.最后做出了什么东西.做出来的东西有什么用. 1. 前言 系统的背景与意义:为什么要做这个系统 ? 现状调查:别人做的怎么样? 系 ...

  6. 在查询语句中使用 NOLOCK 和 READPAST

    对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问 ...

  7. O(1)空间内实现矩阵转置

    思路:  * 每个元素转置前后会形成一个环(一个数字有多个环)  * 利用环来移动元素达到转置  * 关键:  * 1.得到元素下标的前驱后继,  * 2.判断环是否已走过(意味属于一个环的元素一次转 ...

  8. mysql 数据类型别名参考

    To facilitate the use of code written for SQL implementations from other vendors, MySQL maps data ty ...

  9. MFC误报内存泄露的修复

    在debug状态退出程序的时候,VS会在输出窗口列出可能的内存泄露的地方. MFC中使用DEBUG_NEW能够更方便的定位泄露的地点.但假如MFC的dll释放""过早"& ...

  10. cassandra 3.x官方文档(2)---架构解析

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...