题目要求是从txt文件中读取信息,再根据一定格式写入到xml文件中去。txt文件中的文本如下
201833,王二,操作系统,70
201834,张三,操作系统,90
201834,张三,嵌入式系统,20
要求写入的xml文件如下
写入xml文件
1,下载 jdom包。http://www.jdom.org/downloads/index.html
点击第一个链接,下载zip文件后,使用第一个jar就行了
然后右击自己的项目,选择build path -->configure buile path-->ADD JARS 选择第一个jar就行了
eclipse自动补全
Eclipse -> Window -> Perferences
找到Java 下的 Editor 下的 Content Assist
在Auto activation triggers for Java后面的文本框里只有一个“.”
把 “.” 改成 “.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”
Alt + Shift + s + r
Alt + Shift + s + o
eclipse替换变量名
按下ctrl+f, 弹出下面右边界面,输入要寻找的id,替换为ID,在Options下要勾选下面两个箭头的两个,点击Replace All全部替换
student.java
定义学生结构体的意思
import java.util.ArrayList;
public class student {
private String stu_id; //学生id
private String stu_name; //学生姓名
private ArrayList<course> courses; //课程
public student(String stu_id,String stu_name,ArrayList<course> courses) {
// TODO Auto-generated constructor stub
this.courses=courses;
this.stu_id=stu_id;
this.stu_name=stu_name;
}
public ArrayList<course> getCourses() {
return courses;
}
public String getStu_id() {
return stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setCourses(ArrayList<course> courses) {
this.courses = courses;
}
public void setStu_id(String stu_id) {
this.stu_id = stu_id;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
}
course.java
定义课程结构体的意思
public class course {
private String courseName;//课程名
private int score; //分数
course(String courseName,int score){
this.courseName=courseName;
this.score=score;
}
public String getCourseName() {
return courseName;
}
public int getScore() {
return score;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public void setScore(int score) {
this.score = score;
}
}
Main.java
1,调用readFile函数,把text.txt文件里的内容一行一行的读出来(直接调用就可以了,不要在意是不是要读一行处理一行)。
2,看输出格式有没有对某个变量排序处理,有的话就加上排序处理。
3,把学生信息存入MAP容器里(学生的学号为对照值)。
4,写入.xml文件。
一般是先写一个大标签,再写小的,一层套一层。当一个标签里有很多小标签时,就一个一个小标签加进去。
输入.xml文件也是直接套用就好了。
//创建学号标签并加入到学生标签内
Element e_stuid=new Element("学号");
e_stuid.setText(m.get(s).getStu_id());
student.addContent(e_stuid);
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class Main {
//readFile函数,一行一行读取.txt文件里的数据,直接引用就好了
private static ArrayList<String> readFile(String filename){
//设置返回结果
ArrayList<String> result=new ArrayList<>();
/* 读取文件*/
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename))));
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
result.add(lineTxt);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println("姓名:" );
return result;
}
//将信息写入xml文件
private static void writeFile(Map<String,student> m,String filename){
//创建文档
Document document=new Document();
//创建根元素,即students标签
Element students=new Element("s1tudents");
//根元素加入到document中
document.addContent(students);
Element student;
for(String s:m.keySet()){//map.keySet()获取map全部的key值
//创建学生标签
student=new Element("s2tudent");
//创建学号标签并加入到学生标签内
Element e_stuid=new Element("学号");
e_stuid.setText(m.get(s).getStu_id());
student.addContent(e_stuid);
//创建姓名标签并加入到学生标签内
Element e_stuname=new Element("姓名");
e_stuname.setText(m.get(s).getStu_name());
student.addContent(e_stuname);
//循环创建课程标签并加入到学生标签内
for(course c:m.get(s).getCourses()){
Element e_course=new Element("课程");
//输出的格式是<课程 课程名="操作系统">xxxxxx</课程>
e_course.setAttribute("课程名",c.getCourseName());//在e_course对象中加入名为课程名的属性并附值为c.getCourseName()的值
e_course.setText(c.getScore()+"");//<姓名>张三</姓名> 就是填中间的那个名字
student.addContent(e_course);//把上面那句话显示出来
}
//将单个学生标签加入到根标签
students.addContent(student);
}
//设置xml输出格式
Format format = Format.getPrettyFormat();
// format.setEncoding("utf-8");//设置编码
//format.setIndent(" ");//设置缩进
//得到xml输出流
XMLOutputter out = new XMLOutputter(format);
//把数据输出到xml中
try {
out.output(document, new FileOutputStream(filename));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//用来测试输出map
private static void showMap(Map<String,student> m){
for(String s:m.keySet()){
System.out.println(m.get(s).getStu_id()+" "+m.get(s).getStu_name()+" ");
for(course c:m.get(s).getCourses()){
System.out.println(c.getCourseName()+" "+c.getScore());
}
System.out.println("---------------------");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//读取文件获取字符数组
ArrayList<String> strs=readFile("D:\\test.txt");
//因为要对学号进行降序排序,并且一个学生id对应学生类,使用Trrmap存储信息,java中TreeMap元素之间是有序的
//所以如果没有顺序要求,这个就不要写
Map<String, student> students=new TreeMap<>(new Comparator<String>() {
//自定义比较器,TreeMap默认为升序
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
//降序
return o2.compareTo(o1);
}
});
//定义字符数组
String []info;
//学生学号
String stu_id;
//System.out.println( strs.size());
for(int i=0;i<strs.size();i++){
info=strs.get(i).split(",");//根据逗号进行字符串分割信息
stu_id=info[0];//获取学号
//System.out.println( "i="+i+" "+strs.size());
if(!students.containsKey(stu_id)){//containKey 判断Map集合对象中是否包含指定的键名
//如果map中还未有学号,创建学生对象
student newstu=new student(stu_id, info[1], new ArrayList<course>());
//课程数组加入课程
newstu.getCourses().add(new course(info[2], Integer.parseInt(info[3])));//Integer.parseInt()方法将一个字符串转换成int型
//加入到map
students.put(stu_id, newstu);
}
else{
//如果map中已有对象则加入对应学生的课程中即可
students.get(stu_id).getCourses().add(new course(info[2], Integer.parseInt(info[3])));
}
}
//showMap(students);
//写入xml文件
writeFile(students, "D:\\output.xml");
}
}
运行出来的结果截图
2,输入:
E001,张三,22,A112,北京现代,2011-3-26 10:13:10,邳州,万胜围,20
E020,李四,32,A345,上海大众,2011-3-22 11:10:22,体育西路,客村,30
E212,王五,23,A213,美国宝马,2011-3-26 08:15:14,官洲,大学城南,10
Emp.java
import java.util.ArrayList;
public class Emp {
private String EID; //学生id
private String EName; //学生姓名
private int Age;
private ArrayList<Bus> Buss; //课程
public Emp(String eID, String eName, int age, ArrayList<Bus> buss) {
super();
EID = eID;
EName = eName;
Age = age;
Buss = buss;
}
public String getEID() {
return EID;
}
public void setEID(String eID) {
EID = eID;
}
public String getEName() {
return EName;
}
public void setEName(String eName) {
EName = eName;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public ArrayList<Bus> getBuss() {
return Buss;
}
public void setBuss(ArrayList<Bus> buss) {
Buss = buss;
}
}
Bus.java
public class Bus {
private String BID;//课程名
private String Pro;//生产是商
private String Time;
private String Sta;
private String End;
private int Dis;
public String getBID() {
return BID;
}
public void setBID(String bID) {
BID = bID;
}
public String getPro() {
return Pro;
}
public void setPro(String pro) {
Pro = pro;
}
public String getTime() {
return Time;
}
public void setTime(String time) {
Time = time;
}
public String getSta() {
return Sta;
}
public void setSta(String sta) {
Sta = sta;
}
public String getEnd() {
return End;
}
public void setEnd(String end) {
End = end;
}
public int getDis() {
return Dis;
}
public void setDis(int dis) {
Dis = dis;
}
public Bus(String bID, String pro, String time, String sta, String end, int dis) {
super();
BID = bID;
Pro = pro;
Time = time;
Sta = sta;
End = end;
Dis = dis;
}
}
Main.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class Main {
private static ArrayList<String> readFile(String filename){
//设置返回结果
ArrayList<String> result=new ArrayList<>();
/* 读取文件*/
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename))));
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
result.add(lineTxt);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println("姓名:" );
return result;
}
//将信息写入xml文件
private static void writeFile(Map<String,Emp> m,String filename){
//创建文档
Document document=new Document();
//创建根元素,即students标签
Element Emps=new Element("Emps");
//根元素加入到document中
document.addContent(Emps);
Element Emp;
for(String s:m.keySet()){//map.keySet()获取map全部的key值
//创建学生标签
Emp=new Element("emp");
//创建学号标签并加入到学生标签内
Element EID=new Element("员工号");
EID.setText(m.get(s).getEID());
Emp.addContent(EID);
//创建姓名标签并加入到学生标签内
Element EName=new Element("员工姓名");
EName.setText(m.get(s).getEName());
Emp.addContent(EName);
Element Age=new Element("年龄");
Age.setText(m.get(s).getAge()+"");
Emp.addContent(Age);
//循环创建课程标签并加入到学生标签内
for(Bus c:m.get(s).getBuss()){
Element Buss=new Element("车辆");
//输出的格式是<课程 课程名="操作系统">xxxxxx</课程>
Element BID=new Element("车牌号");
BID.setText(c.getBID());
Buss.addContent(BID);
Element Pro=new Element("生产厂商");
Pro.setText(c.getPro());
Buss.addContent(Pro);
Element Time=new Element("发车时间");
Time.setText(c.getTime());
Buss.addContent(Time);
Element Bus=new Element("距离");
Bus.setAttribute("始发站",c.getSta());
//在e_course对象中加入名为课程名的属性并附值为c.getCourseName()的值
Bus.setAttribute("终点站",c.getEnd());
Bus.setText(c.getDis()+"");//<姓名>张三</姓名> 就是填中间的那个名字
Buss.addContent(Bus);//把上面那句话显示出来
Emp.addContent(Buss);
/*Element Sta=new Element("始发站");
Sta.setText(c.getSta());
Bus.addContent(Sta);
Element End=new Element("终点站");
End.setText(c.getEnd());
Bus.addContent(End);
Element Dis=new Element("距离");
Dis.setText(c.getDis());
Bus.addContent(Dis);*/
}
//将单个学生标签加入到根标签
Emps.addContent(Emp);
}
//设置xml输出格式
Format format = Format.getPrettyFormat();
// format.setEncoding("utf-8");//设置编码
//format.setIndent(" ");//设置缩进
//得到xml输出流
XMLOutputter out = new XMLOutputter(format);
//把数据输出到xml中
try {
out.output(document, new FileOutputStream(filename));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//用来测试输出map
/*private static void showMap(Map<String,Emp> m){
for(String s:m.keySet()){
System.out.println(m.get(s).getStu_id()+" "+m.get(s).getStu_name()+" ");
for(Bus c:m.get(s).getCourses()){
System.out.println(c.getCourseName()+" "+c.getScore());
}
System.out.println("---------------------");
}
}*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//读取文件获取字符数组
ArrayList<String> strs=readFile("D:\\复试复习\\机试\\2011_1\\in.txt");
//因为要对学号进行降序排序,并且一个学生id对应学生类,使用Trrmap存储信息,java中TreeMap元素之间是有序的
//所以如果没有顺序要求,这个就不要写
Map<String, Emp> Emps=new TreeMap<>(new Comparator<String>() {
//自定义比较器,TreeMap默认为升序
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
//降序
return o2.compareTo(o1);
}
});
//定义字符数组
String []info;
//学生学号
String EID;
//System.out.println( strs.size());
for(int i=0;i<strs.size();i++){
info=strs.get(i).split(",");//根据逗号进行字符串分割信息
EID=info[0];//获取学号
//System.out.println( "i="+i+" "+strs.size());
if(!Emps.containsKey(EID)){//containKey 判断Map集合对象中是否包含指定的键名
//如果map中还未有学号,创建学生对象
Emp newEmp=new Emp(EID, info[1], Integer.parseInt(info[2]),new ArrayList<Bus>());
//课程数组加入课程
newEmp.getBuss().add(new Bus(info[3], info[4],info[5],info[6],info[7],Integer.parseInt(info[8])));//Integer.parseInt()方法将一个字符串转换成int型
//加入到map
Emps.put(EID, newEmp);
}
else{
//如果map中已有对象则加入对应学生的课程中即可
Emps.get(EID).getBuss().add(new Bus(info[3], info[4],info[5],info[6],info[7],Integer.parseInt(info[8])));
}
}
//showMap(Emps);
//写入xml文件
writeFile(Emps, "D:\\复试复习\\机试\\2011_1\\output.xml");
}
}
运行结果截图