<?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 晚安 妞