聪聪工作室---XML---从txt文件中读取内容存到XML文件中-程序员宅基地

技术标签: java  开发工具  

文章转自:https://www.jianshu.com/p/b6ee0d5b463d

 

在实现这个程序中遇到一些编码问题,从txt文件中得到的数据放入xml文件的过程中报错

后来解决了,是转码问题,在eclipse中的build path中把编码格式转成utf-8输出


思路:

分析info.txt文件中的数据,构建一个构造函数类

Regionn.java 代码

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement; @XmlAccessorType(XmlAccessType.FIELD) public class Regionn { @XmlAttribute(name = "id") private String id; @XmlElement(name = "name") private String name; @XmlElement(name = "boss") private String boss; @XmlElement(name = "avgIncome") private String avgIncome; @XmlElement(name = "superRegion") private String superRegion; public Regionn() { } public Regionn(String id) { this(); this.id = id; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBoss() { return boss; } public void setBoss(String boss) { this.boss = boss; } public String getAvgIncome() { return avgIncome; } public void setAvgIncome(String avgIncome) { this.avgIncome = avgIncome; } public String getSuperRegion() { return superRegion; } public void setSuperRegion(String superRegion) { this.superRegion = superRegion; } @Override public String toString() { return "Region [id=" + id + ", name=" + name + ", boss=" + boss + ", avgIncome=" + avgIncome + ", superRegion=" + superRegion + "]"; } } 

代码截图:


 
Regionn01.png
 
Regionn02.png

思路:

思路的第一点是把txt中的文件读取出来,并把它存放到一个集合中

具体实现:

RegionInfoParser.java 代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList; import java.util.List; public class RegionInfoParser { public static List<Regionn> parseRegions(String filename) { // List<Region> �Ƿ���ֵ���� ��String filename)�Ǵ���IJ��� BufferedReader br = null;// ��ʼ��Ϊ�� List<Regionn> results = new ArrayList<Regionn>(); // <Regionn>�Ƿ��� // ����һ��ArrayList ���� try { br = new BufferedReader(new FileReader(filename));// ���ļ� String line = null;// ��ʼ��line while ((line = br.readLine()) != null) { // ����ȡ������Ϣ��Ϊ��ʱ line = line.trim();// ȥ�����ߵĿո� if (line.startsWith("#")) { continue;// �����#��ͷ�ģ�������� } String[] patterns = line.split(","); // �Ѷ��������л��Զ��Ž��зָ���ַ�浽������ String id = patterns[0];// ����pattern�����±�Ϊ0���ַ�Ϊid String name = patterns[1]; String avgIncome = patterns[2]; String superRegion = patterns[3]; String boss = (patterns.length == 5) ? patterns[4] : "";// 判断 // 如果patterns这个数组的长度是5的话,那就把数组中最后一个下标的值定义为空字符串 // 多余的加的一个知识点,条件判断 Regionn region = new Regionn(); // Regionn���Զ���ķ����� region.setId(id);// �Ѵ�info.txt�ļ���ȡ����һ�����ַָ���ַ���������� // Ȼ�������������±�Ϊ0���ַ���Regionn������е�setId()�ķ�������Ϊ������ region.setName(name); region.setAvgIncome(avgIncome); region.setSuperRegion(superRegion); region.setBoss(boss); results.add(region);// ������б��ĩβ���ָ����� // List�ǹ����б?��ĩβ���region������ŵ�����String���͵ģ� // Ȼ�������ŵ�List��һ�������г����������б� } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) {
                                                                   // 最后,如果继续读取的不是空的话 try { br.close();// 一个循环后执行操作关闭继续读取 } catch (IOException e) { e.printStackTrace();// 返回异常 } } } return results; } } 

代码截图:


 
RegionInfoParser01.png
 
RegionInfoParser02.png

思路:

现在需要一个List的包装类,把得到的集合数据放到List<Regionn> regions这个集合类中去

RegionList.java 代码

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思 @XmlAccessorType(XmlAccessType.FIELD) public class RegionList { @XmlElement(name="regions") private List<Regionn> regions;//定义一个集合类 public RegionList(){ regions=new ArrayList<Regionn>(); //构造函数中的这个regions 是一个集合 new一个新的集合 } public void setRegions(List<Regionn> regions){ this.regions=regions;//(List<Regionn> regions)传入一个参数是一个集合 } public List<Regionn> getRegions(){ return regions;//List<Regionn>是这个方法的返回值类型,getRegions得到这个集合 } public void addRegion(Regionn region){ this.regions.add(region);//region是传入的参数,把这个类中的内容add添加到这个List列表中,List滚动列表 } } 

代码截图:


 
RegionList01.png

思路:

现在全部的准备操作已经完成,现在是用JAXB来存入数据到xml文件中去,RegionList文件是为JAXB做准备的,@XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思
@XmlAccessorType(XmlAccessType.FIELD)
@XmlElement(name="regions")
private List<Regionn> regions;//定义一个集合类

RegionInfoConverter.java 代码

import java.io.File;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException; public class RegionInfoConverter { public static void main(String[] args) { List<Regionn> regions=RegionInfoParser.parseRegions("info.txt"); //这是一个List列表,里面有11组数据,一组数据是读出的一行内容分割成的字符串数组 RegionList regionListObj=new RegionList(); //new一个RegionList集合类 ,只是为了传参数 regionListObj.setRegions(regions);//把得到的regions这个集合中的数据传入 try { JAXBContext ctx=JAXBContext.newInstance(RegionList.class);//套路,从RegionList这个Class文件中得到 //在jaxb中,通常如果声明JAXBContext对象:其实它是一个抽象类 ctx.createMarshaller().marshal(regionListObj,new File("info.xml")); /* marshal 整理,排列,集结 ,regionList是new 的一个RegionList这个类的一个对象,新建一个xml文件,把regionList这个内容所转化出来的数据放入xml文件中 * Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。 * 它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成 * 到 java.io.OutputStream 或 java.io.Writer 中时, * Marshaller 将使用 UTF-8 编码。 */ } catch (JAXBException e) { e.printStackTrace();//返回异常 } } } 

代码截图:


 
RegionInfoConverter.png

实现的内容:


 
image.png

以下是对JAXBContext的操作理解

(1)JAXBContext。 JAXBContext类提供到 JAXB API 的客户端入口点。它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组(Unmarshaller )、编组(Marshaller)和验证(Validator)。通常使用JAXBContext.newInstance(XXX.class) 来获取JAXBContext实例(Student是我定义的一个Entity)。

JAXBContext ctx = JAXBContext.newInstance(Student.class)

(2)Unmarshaller。 Unmarshaller 是一个Interface,它管理将 XML 数据反序列化为新创建的 Java 内容树的过程,并可在解组时有选择地验证 XML 数据。它针对如File,InputStream,URL,StringBuffer等各种不同的输入种类,提供各种重载的 unmarshal 方法。unmarshal 方法从不返回 null。如果unmarshal无法将 XML 内容的根解组到 JAXB 映射对象,则抛出 JAXBException。

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Student stu = (Student) unmarshaller.unmarshal(file);

(3)Marshaller。Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成到 java.io.OutputStream 或 java.io.Writer 中时,Marshaller 将使用 UTF-8 编码。

            Marshaller marshaller = ctx.createMarshaller();         
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 格式化输出
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 设置输出编码,默认为UTF-8 marshaller.marshal(stu, xmlFile); 

作者: 聪聪工作室



作者:繁花流水congcong
链接:https://www.jianshu.com/p/b6ee0d5b463d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/xzhuan/articles/txtToxml.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/acw0866/article/details/101588907

智能推荐

虚拟机如何在net模式下进行联网_虚拟机net网络-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏7次。虚拟机如何在net模式下进行联网(centos7)1.首先你需要先将虚拟机安装好,如果不会可以参考[centos7安装教程](https://blog.csdn.net/qq_44714603/article/details/88829423?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161949204316780274178621%2522%252C%2522scm%2522%253A%252220140713.130102334…_虚拟机net网络

python中的range()函数_python range函数-程序员宅基地

文章浏览阅读6.5w次,点赞59次,收藏241次。range()函数:用于生成一个整数序列;range()的三种创建方式:第一种:只有一个参数(小括号中只给了一个数)即range(stop)例如:range(10)指的是默认从0开始,步长为1,不包括10;注意:的运行结果为:;要想输出0-9的数字序列则应该是的结果为;第二种:range(start,stop) (给了两个参数,即小括号中给了两个数)r=range(1,10) print(list(r)) 运行结果为:;第三种:range(start,stop,step):._python range函数

数据的四种基本存储方法_数据存储-程序员宅基地

文章浏览阅读2.5k次。数据的四种基本存储方法,(1)顺序存储方法(2)链接存储方法(3)索引存储方法(4)散列存储方法_数据存储

Mysql启用SSL以及JDBC连接Mysql配置_jdbc mysql ssl-程序员宅基地

文章浏览阅读6.7k次。一、Mysql启用SSL配置1.检查mysql是否支持ssl在linux端用root账号进入mysql命令行界面,查看当前版本mysql数据库是否支持ssl,如果出现以下结果表示支持,如果没有考虑更换版本,或者编译一个带有SSL版本的mysqlshell>show variables like ‘%ssl%’;2.设置用户是否使用ssl连接1.查看用户是否使用SSL连接she..._jdbc mysql ssl

java jwt使用,springboot 整合java-jwt,java jwt工具类-程序员宅基地

文章浏览阅读612次。java jwt使用,springboot 整合java-jwt,java jwt工具类================================Copyright 蕃薯耀2020-12-03https://www.cnblogs.com/fanshuyao/一、引入java-jwt的maven依赖<dependency> <groupId>..._jwtproperties

聊聊 Kafka: 在 Linux 环境上搭建 Kafka,Linux运维未来路在何方-程序员宅基地

文章浏览阅读753次,点赞21次,收藏15次。列出现有主题,创建主题,该主题包含一个分区,该分区为Leader分区,它没有Follower分区副本。启动成功,可以看到控制台输出的最后一行的started状态:此时kafka安装成功。查看zookeeper状态,zookeeper启动成功,再启动kafka。onsole-producer.sh用于生产消息**开启消费者和生产者,生产并消费消息。开启消费者和生产者,生产并消费消息。在Zookeeper中的根节点路径。创建主题,该主题包含多个分区。的地址,此处使用本地启动的。查看指定主题的详细信息。

随便推点

麒麟820也迎来鸿蒙系统,魅族适配麒麟820系统 和鸿蒙OS,魅族要入赘华为系-程序员宅基地

文章浏览阅读188次。蜗居在珠海的小厂魅族,虽然是“小厂”,但是其一路走来的历史,一直被科技圈津津乐道,而深入简出的带头大哥黄章,更是魅友的精神领袖。魅族是一个很低调的企业,但是却有这样一种魅力,总能有意无意的成为新闻的主角,比如近日知名科技大V中国IT杂谈发布了这样一条微博:魅族正在适配麒麟820和鸿蒙系统,未来还要加入华为系。关于这条信息的真实性后面再说,我们先来讨论下华为和魅族是否真的可以成为CP,共同走向人生巅..._鸿蒙420支持麒麟820吗

GoLand live template自定义模板失效问题解决_live template 在jsp中不生效-程序员宅基地

文章浏览阅读306次。GoLand live template自定义模板失效问题解决_live template 在jsp中不生效

STM32F103 外部中断(EXTI)介绍以及代码_stm32f103的exti16连接到 事件,exti17连接到 事件,exti18连接到 事件。s-程序员宅基地

文章浏览阅读603次。如果用 GPIO 作为外部中断,需要配置 AFIO,来选择是哪个端口,可以是 GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG,需要注意的是,对于同一个 Pin 脚,只能选择配置一个端口,例如我配置 Pin15 为 GPIOC,那么就不能再用用 GPIOA/B/D/E/F/G 15 作为 EXTI ,如下图所示。②Edge Detect :边缘检测,可以是上升沿触发,也可以是下降沿触发,还可以是上升沿和下降沿都可以分别触发,对应图中 ②-1 和 ②-2。_stm32f103的exti16连接到 事件,exti17连接到 事件,exti18连接到 事件。stm32f

在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch_conda安装cudnn-程序员宅基地

文章浏览阅读9.2w次,点赞109次,收藏364次。conda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch_conda安装cudnn

2742: 【数据结构】【栈】字符串匹配问题-程序员宅基地

文章浏览阅读346次,点赞6次,收藏8次。字符串中只含有括号 (),[],,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。文件的第一行为一个整数n(0

CSS的继承性和层叠式_css继承与层叠-程序员宅基地

文章浏览阅读689次。color、text-开头的、line-开头的,font-开头的这些关于文字样式的,都可以继承;所有的盒子的、定位的、布局属性都不能继承。多个选择器同时作用在同一个元素上时候,看权重,那个高,最后显示那个,优先级从高到低分别是:先比较ID选择器数量,在比较类选择器数量,最后比较标签选择器数量最后显示的绿色,因为ID选择器数量优先级高,所以以2为准了,如果都一样,谁写在后面,谁的生效。如果不能直接选中某个元素权重是0,如通过继承而来的权重是0,开始数权重之前一定要看看是不是真的选中文字所在的最内层的标签,没选_css继承与层叠

推荐文章

热门文章

相关标签