转换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>(&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  晚安 妞


可以使用Python中的xml.etree.ElementTree模块将yolov5的txt标注文件转换xml格式。具体实现可以参考以下代码: ```python import xml.etree.ElementTree as ET def convert_txt_to_xml(txt_path, xml_path, class_list): with open(txt_path, 'r') as f: lines = f.readlines() root = ET.Element('annotation') folder = ET.SubElement(root, 'folder') folder.text = 'images' filename = ET.SubElement(root, 'filename') filename.text = txt_path.split('/')[-1].split('.')[] + '.jpg' size = ET.SubElement(root, 'size') width = ET.SubElement(size, 'width') width.text = '416' height = ET.SubElement(size, 'height') height.text = '416' depth = ET.SubElement(size, 'depth') depth.text = '3' for line in lines: line = line.strip().split() class_name = class_list[int(line[])] xmin = line[1] ymin = line[2] xmax = line[3] ymax = line[4] object = ET.SubElement(root, 'object') name = ET.SubElement(object, 'name') name.text = class_name bndbox = ET.SubElement(object, 'bndbox') xmin_node = ET.SubElement(bndbox, 'xmin') xmin_node.text = xmin ymin_node = ET.SubElement(bndbox, 'ymin') ymin_node.text = ymin xmax_node = ET.SubElement(bndbox, 'xmax') xmax_node.text = xmax ymax_node = ET.SubElement(bndbox, 'ymax') ymax_node.text = ymax tree = ET.ElementTree(root) tree.write(xml_path) # 示例代码 txt_path = 'path/to/your/txt/file.txt' xml_path = 'path/to/your/xml/file.xml' class_list = ['class1', 'class2', 'class3'] # 类别列表 convert_txt_to_xml(txt_path, xml_path, class_list) ``` 其中,`txt_path`为yolov5的txt标注文件路径,`xml_path`为转换后的xml文件路径,`class_list`为类别列表,需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值