一、XML文档解析基础概念
1、XML文档有四种解析方法:
(1)Dom文档对象解析
(2)SAX简单的XML API
(3)JDOM Java文档对象模型(常用)
(4)DOM4J扩展与JDOM(常用)
本文主要讲解最后一种解析方法:
2、Dom4j解析XML文档
dom4j是由第三方提供扩展子JDOMAPI的一组解析XML文件的java实现,它只和java有关。dom4j对XML文档实现与JDOM类似,idom将XML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级的获取等实用方法。
dom4j解析XML大体分为两种操作:
(1)读取目标XML文档并解析,封装成运行时的Java对象进行处理
(2)将运行时Java对象以XML文件方式写入硬盘存储
3、Dom4j写入XML文档步骤
:
(1)创建DocumentFactory用来创建Document对象
(2)使用DOM4J实现对Document对象操作
(3)创建XMLWriter用来将Document对象写入XML文件
(4)关闭相关文件流
4、Dom4j读取XML文档步骤:
(1)基于xml文件路径创建File对象
(2)创建SAXReader用来加载xml文件为Document
(3)利用DOM4J相关方法解析XML文档
(4)封装文档对象数据为Java对象
二、程序实例
下面通过一个实例进行学习:
实例概要
:由XML文档存储学生数据,并对其数据进行增删改查的操作
学生类:
package com.entity;
/**
* 学生类
* @author NEYMAR
*
*/
public class Student {
private String code;//学号
private String name;//姓名
private String sex;//性别
private String specialty;//专业
/**
* 无参构造函数
*/
public Student() {
;
}
/**
* 含参构造函数
* @param code 学号
* @param name 姓名
* @param sex 性别
* @param specialty 专业
*/
public Student(String code,String name,String sex,String specialty) {
this.code=code;
this.name=name;
this.sex=sex;
this.specialty=specialty;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSpecialty() {
return specialty;
}
public void setSpecialty(String specialty) {
this.specialty = specialty;
}
}
工具类:
package com.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.entity.Student;
/**
* 工具类
* @author NEYMAR
*
*/
public class Tools {
/**
* 获取当前项目路径
* @return 返回该路径
*/
public static String getprojectPath() {
String Path=System.getProperty("user.dir");
return Path;
}
/**
* 获取类路径
* @return 返回该路径
*/
public static String getClassPath() {
String Path=Tools.class.getClassLoader().getResource("").getPath().toString();
return Path;
}
/**
* 判断学生对象是否为空
* @param e 学生对象
* @return 若为空,则返回true,若不为空,则返回false
*/
public static boolean isListEmpty(Student e) {
if(e==null)
return true;
return false;
}
/**
* 判断XML文件是否存在
* @param Path 路径
* @return 若存在,则返回true,否则返回false
*/
public static boolean isXmlEmpty(String name) {
String classPath=Tools.getClassPath();//获取类路径
File file=new File(classPath+"com/Xml/"+name);
if(file.exists())
return true;
return false;
}
}
实现解析XML文档数据的类(
核心
):
package com.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.entity.Student;
/**
* 用Dom4j方式解析XML文档
* @author NEYMAR
*
*/
public class Dom4jManger {
//用DocumentFactory的静态方法创建DocumentFactory对象
public static DocumentFactory docfactory=DocumentFactory.getInstance();
/**
* 初始化XML文档
* @param fileName 文件名
*/
public Dom4jManger(String fileName,Student stu) {
Document doc=docfactory.createDocument("utf-8");//创建document实例,并规定其编码格式为UTF-8
Element rootEle=docfactory.createElement("Students");//创建文档根元素
doc.setRootElement(rootEle);//设置文档
//若STU对象不为空
if(!Tools.isListEmpty(stu)) {
Element stuEle=docfactory.createElement("student");//创建rooeEle下的子元素
Element NameEle=docfactory.createElement("name");//创建stuEle下的子元素name
NameEle.setText(stu.getName());//设置NameEle的文本值
Element SexEle=docfactory.createElement("sex");
SexEle.setText(stu.getSex());
Element CodeEle=docfactory.createElement("code");
CodeEle.setText(stu.getCode());
Element SpecialtyEle=docfactory.createElement("specialty");
SpecialtyEle.setText(stu.getSpecialty());
/*将子元素添加到stuEle中*/
stuEle.add(NameEle);
stuEle.add(CodeEle);
stuEle.add(SexEle);
stuEle.add(SpecialtyEle);
/*将stuEle元素添加到根元素下*/
rootEle.add(stuEle);
}
String classPath=Tools.getClassPath();//获取类路径
File xmlFile=new File(classPath+"com/Xml/"+fileName);//创建目标文件对象
Writer writer=null;
try {
writer=new FileWriter(xmlFile);//创建Writer对象
XMLWriter xmlWriter=new XMLWriter(writer,OutputFormat.createPrettyPrint());//OutputFormat.createPrettyPrint()可以使XML文件形成一种规范
xmlWriter.write(doc);//保存为XML目标文件
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 在XML文档中添加学生对象
* @param fileName XML文件名称
* @param stuList 学生的对象
*/
public static void AddStudent(String fileName,Student stu) {
String classPath=Tools.getClassPath();//获取类路径
File xmlFile=new File(classPath+"com/Xml/"+fileName);//基于文件路径创建文件对象
Reader reader=null;
Writer writer=null;
try {
reader=new FileReader(xmlFile);//基于XML文件建立文件流
SAXReader saxReader=new SAXReader();//建立SAX文件对象流
Document docReader=saxReader.read(reader);//读取XML文件
if(docReader!=null) {
Element rootEle=docReader.getRootElement();//获取根元素
Element stuEle=docfactory.createElement("student");//创建rooeEle下的子元素
Element NameEle=docfactory.createElement("name");//创建stuEle下的子元素name
NameEle.setText(stu.getName());//设置NameEle的文本值
Element SexEle=docfactory.createElement("sex");
SexEle.setText(stu.getSex());
Element CodeEle=docfactory.createElement("code");
CodeEle.setText(stu.getCode());
Element SpecialtyEle=docfactory.createElement("specialty");
SpecialtyEle.setText(stu.getSpecialty());
/*将子元素添加到stuEle中*/
stuEle.add(NameEle);
stuEle.add(CodeEle);
stuEle.add(SexEle);
stuEle.add(SpecialtyEle);
/*将stuEle元素添加到根元素下*/
rootEle.add(stuEle);
}
writer=new FileWriter(xmlFile);//创建Writer对象
XMLWriter xmlWriter=new XMLWriter(writer,OutputFormat.createPrettyPrint());//OutputFormat.createPrettyPrint()可以使XML文件形成一种规范
xmlWriter.write(docReader);//保存为XML目标文件
//writer.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
writer.close();
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 删除学生对象
* @param fileName XML文件名称
* @param stu 学生对象
*/
public static void removeStudent(String fileName,String code) {
String classPath=Tools.getClassPath();//获取类路径
File xmlFile=new File(classPath+"com/Xml/"+fileName);//基于文件路径创建文件对象
Reader reader=null;
Writer writer=null;
try {
reader=new FileReader(xmlFile);//基于XML文件建立文件流
SAXReader saxReader=new SAXReader();//建立SAX文件对象流
Document docReader=saxReader.read(reader);//读取XML文件
if(docReader!=null) {
Element rootEle=docReader.getRootElement();//获取根元素
List<Element> elements=rootEle.elements("student");//获取根元素下所有子元素
for(Element e:elements) {//遍历根元素
String codeValue=e.element("code").getText();//获取code属性值进行对比
if(code.equals(codeValue)) {
Element par=e.getParent();
par.remove(e);
}
}
}
writer=new FileWriter(xmlFile);//创建Writer对象
XMLWriter xmlWriter=new XMLWriter(writer,OutputFormat.createPrettyPrint());//OutputFormat.createPrettyPrint()可以使XML文件形成一种规范
xmlWriter.write(docReader);//保存为XML目标文件
//writer.flush();
//writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
reader.close();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 读取XMl文档内的学生对象信息
* @param fileName 文件路径
*/
public static List<Student> PrintStudent(String fileName) {
List<Student> stuList=new ArrayList<Student>();
String classPath=Tools.getClassPath();//获取类路径
File xmlFile=new File(classPath+"com/Xml/"+fileName);//基于文件路径创建文件对象
Reader reader=null;
try {
reader=new FileReader(xmlFile);//基于XML文件建立文件流
SAXReader saxReader=new SAXReader();//建立SAX文件对象流
Document docReader=saxReader.read(reader);//读取XML文件
if(docReader!=null) {
Element rootEle=docReader.getRootElement();//获取根元素
List<Element> eleList=rootEle.elements("student");//获取所有根元素下的子元素
for(Element e:eleList) {
Student empObj=new Student();
String name=e.element("name").getText();//获取元素name
empObj.setName(name);
String code=e.element("code").getText();//获取元素code
empObj.setCode(code);
String sex=e.element("sex").getText();//获取元素sex
empObj.setSex(sex);
String specialty=e.element("specialty").getText();//获取元素specialty
empObj.setSpecialty(specialty);
stuList.add(empObj);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return stuList;
}
/**
* 修改学生信息
* @param fileName XML文档名
* @param stu 被修改的学生对象
*/
public static void changeStudent(String fileName,Student stu) {
String classPath=Tools.getClassPath();//获取类路径
File xmlFile=new File(classPath+"com/Xml/"+fileName);//基于文件路径创建文件对象
Reader reader=null;
Writer writer=null;
try {
reader=new FileReader(xmlFile);//基于XML文件建立文件流
SAXReader saxReader=new SAXReader();//建立SAX文件对象流
Document docReader=saxReader.read(reader);//读取XML文件
if(docReader!=null) {
Element rootEle=docReader.getRootElement();//获取根元素
List<Element> elements=rootEle.elements("student");//获取根元素下所有子元素
for(Element e:elements) {//遍历根元素
String codeValue=e.element("code").getText();//获取code属性值进行对比
if(stu.getCode().equals(codeValue)) {
Element nameEle=e.element("name");//获取e元素下的子元素name
nameEle.setText(stu.getName());//更改元素name的属性值
Element sexEle=e.element("sex");//获取e元素下的子元素sex
sexEle.setText(stu.getSex());//更改元素sex的属性值
Element specialtyEle=e.element("specialty");//获取e元素下的子元素specialty
specialtyEle.setText(stu.getSpecialty());//更改元素specialty的属性值
}
}
}
writer=new FileWriter(xmlFile);//创建Writer对象
XMLWriter xmlWriter=new XMLWriter(writer,OutputFormat.createPrettyPrint());//OutputFormat.createPrettyPrint()可以使XML文件形成一种规范
xmlWriter.write(docReader);//保存为XML目标文件
//writer.flush();
//writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
reader.close();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
实现可视化窗口以及各项操作的类
package com.frame;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import com.entity.Student;
import com.util.Dom4jManger;
import com.util.Tools;
/**
* 界面类
* @author NEYMAR
*
*/
public class XmlFrame extends JFrame{
private JTabbedPane tabbedPane = new JTabbedPane();//创建一个选项卡
private JPanel addPanel=new JPanel(new GridLayout(6,1,5,5));//添加学生数据面板
private JPanel removePanel=new JPanel(new GridLayout(3,1,5,5));//删除学生数据面板
private JScrollPane printPanel;//浏览学生数据面板
private JPanel changePanel=new JPanel(new GridLayout(6,1,5,5));//修改学生数据面板
private JPanel pathPanel=new JPanel();//增加新的XML路径面板
/*添加学生数据面板组件*/
public JPanel addjp=new JPanel();//XML文档名称
public JPanel addjp1=new JPanel();//学生姓名
public JPanel addjp2=new JPanel();//学生学号
public JPanel addjp3=new JPanel();//学生性别
public JPanel addjp4=new JPanel();//学生专业
public JPanel addjp5=new JPanel();//按钮
public JLabel addjl=new JLabel("文档名称:");//XML文档名称标签
public JLabel addjl1=new JLabel("学生姓名:");//姓名标签
public JLabel addjl2=new JLabel("学生学号:");//学号标签
public JLabel addjl3=new JLabel("学生性别:");//性别标签
public JLabel addjl4=new JLabel("学生专业:");//专业标签
public JTextField addj=new JTextField(); //XML文档名称的文本框
public JTextField addj1=new JTextField(); //学生姓名的文本框
public JTextField addj2=new JTextField(); //学生学号的文本框
public JTextField addj3=new JTextField(); //学生性别的文本框
public JTextField addj4=new JTextField(); //学生专业的文本框
public JButton addb1=new JButton("录入");//定义一个录入按钮
/*新建XML文档面板组件*/
JPanel pathjp1=new JPanel();
public JLabel pathjl1=new JLabel("文档名称:");
public JTextField pathj1=new JTextField();
public JButton pathb1=new JButton("新建");//定义一个录入按钮
/*浏览学生信息面板组件*/
JTable table=null;
Vector row,col;
/*更改学生信息面板组件*/
public JPanel changejp=new JPanel();//XML文档名称
public JPanel changejp1=new JPanel();//学生姓名
public JPanel changejp2=new JPanel();//学生学号
public JPanel changejp3=new JPanel();//学生性别
public JPanel changejp4=new JPanel();//学生专业
public JPanel changejp5=new JPanel();//按钮面板
public JLabel changejl=new JLabel("文档名称:");//XML文档名称标签
public JLabel changejl1=new JLabel("学生姓名:");//姓名标签
public JLabel changejl2=new JLabel("学生学号:");//学号标签
public JLabel changejl3=new JLabel("学生性别:");//性别标签
public JLabel changejl4=new JLabel("学生专业:");//专业标签
public JTextField changej=new JTextField(); //XML文档名文本框
public JTextField changej1=new JTextField(); //学生姓名的文本框
public JTextField changej2=new JTextField(); //学生学号的文本框
public JTextField changej3=new JTextField(); //学生性别的文本框
public JTextField changej4=new JTextField(); //学生专业的文本框
public JButton changeb1=new JButton("更改");//定义一个录入按钮
/*删除学生信息面板组件*/
JPanel removejp1=new JPanel();
JPanel removejp2=new JPanel();
JPanel removejp3=new JPanel();
public JLabel removejl1=new JLabel("文档名称:");//专业标签
public JTextField removej1=new JTextField();//学生性别的文本框
public JLabel removejl2=new JLabel("学生学号:");
public JTextField removej2=new JTextField();
public JButton removeb1=new JButton("删除");//定义一个录入按钮
/**
* 构造函数
*/
public XmlFrame() {
super("学生信息管理系统");
setSize(600,400);//设置窗体大小
//获取屏幕的宽度和高度,并让窗口居中显示
double width=Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double height=Toolkit.getDefaultToolkit().getScreenSize().getHeight();
setLocation((int)(width-this.getWidth())/2, (int)(height-this.getHeight())/2);
setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体关闭规则
Container con=getContentPane();//获取窗口容器
module();//初始化面板中的组件信息
buttonAction();//初始化面板中的点击事件
}
/**
* 组件添加
*/
public void module() {
/*标签面板*/
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);// 设置选项卡标签的布局方式
this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
/*添加学生数据面板信息*/
/*文本框长度*/
//addj.setBorder(null);//去掉文本框边线
addj.setColumns(18);
addj1.setColumns(18);
addj2.setColumns(18);
addj3.setColumns(18);
addj4.setColumns(18);
/*添加组件*/
addjp.add(addjl);
addjp.add(addj);
addjp1.add(addjl1);
addjp1.add(addj1);
addjp2.add(addjl2);
addjp2.add(addj2);
addjp3.add(addjl3);
addjp3.add(addj3);
addjp4.add(addjl4);
addjp4.add(addj4);
addjp5.add(addb1);
/*将学生信息面板添加到增加学生数据面板里*/
addPanel.add(addjp);
addPanel.add(addjp1);
addPanel.add(addjp2);
addPanel.add(addjp3);
addPanel.add(addjp4);
addPanel.add(addjp5);
/*新增XML路径面板信息*/
pathj1.setColumns(18);
pathjp1.add(pathjl1);
pathjp1.add(pathj1);
pathjp1.add(pathb1);
pathPanel.add(pathjp1);
/*浏览学生信息表格*/
col=new Vector();
//设置列名
col.add("学号");
col.add("姓名");
col.add("性别");
col.add("专业");
row=new Vector();
List<Student> stulist=new ArrayList<Student>();
stulist=Dom4jManger.PrintStudent("stu.xml");
for(Student k:stulist) {
Vector line=new Vector();
line.add(k.getCode());
line.add(k.getName());
line.add(k.getSex());
line.add(k.getSpecialty());
row.add(line);
}
table=new JTable(row,col);
printPanel=new JScrollPane(table);
// 将标签组件添加到选项卡中
tabbedPane.add("建立新的xml文档",pathPanel);
tabbedPane.add("添加学生信息",addPanel);
tabbedPane.add("浏览学生信息",printPanel);
tabbedPane.add("更改学生信息",changePanel);
tabbedPane.add("删除学生信息",removePanel);
/*更改学生信息面板*/
changej.setColumns(18);
changej1.setColumns(18);
changej2.setColumns(18);
changej3.setColumns(18);
changej4.setColumns(18);
changejp.add(changejl);
changejp.add(changej);
changejp1.add(changejl1);
changejp1.add(changej1);
changejp2.add(changejl2);
changejp2.add(changej2);
changejp3.add(changejl3);
changejp3.add(changej3);
changejp4.add(changejl4);
changejp4.add(changej4);
changejp5.add(changeb1);
changePanel.add(changejp);
changePanel.add(changejp2);
changePanel.add(changejp1);
changePanel.add(changejp3);
changePanel.add(changejp4);
changePanel.add(changejp5);
/*删除学生信息面板*/
removej1.setColumns(18);
removej2.setColumns(18);
removejp1.add(removejl1);
removejp1.add(removej1);
removejp2.add(removejl2);
removejp2.add(removej2);
removejp3.add(removeb1);
removePanel.add(removejp1);
removePanel.add(removejp2);
removePanel.add(removejp3);
}
/**
* 按钮点击事件
*/
public void buttonAction() {
/*新建按钮点击事件*/
pathb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String pathName=pathj1.getText()+".xml";
if(!Tools.isXmlEmpty(pathName)) {
Student stu=new Student("初始化","初始化","初始化","初始化");
Dom4jManger dom=new Dom4jManger(pathName, stu);
//创建XML文档
JOptionPane.showMessageDialog(null, pathName+"创建成功");
}
else {
JOptionPane.showMessageDialog(null, "该文档已存在");
}
}
});
/*添加按钮点击事件*/
addb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String pathName=addj.getText()+".xml";
if(Tools.isXmlEmpty(pathName)) {
String name=addj1.getText();
String code=addj2.getText();
String sex=addj3.getText();
String spec=addj4.getText();
Student stu=new Student(code,name,sex,spec);
Dom4jManger.AddStudent(pathName, stu);
JOptionPane.showMessageDialog(null, "学生"+name+"添加成功!");
}
else {
JOptionPane.showMessageDialog(null, "该文档不存在");
}
}
});
/*添加按钮点击事件*/
changeb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String pathName=changej.getText()+".xml";
if(Tools.isXmlEmpty(pathName)) {
String name=changej1.getText();
String code=changej2.getText();
String sex=changej3.getText();
String spec=changej4.getText();
Student stu=new Student(code,name,sex,spec);
Dom4jManger.changeStudent(pathName, stu);;
JOptionPane.showMessageDialog(null, "更改成功!");
}
else {
JOptionPane.showMessageDialog(null, "该文档不存在");
}
}
});
/*删除按钮点击事件*/
removeb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String pathName=removej1.getText()+".xml";
if(Tools.isXmlEmpty(pathName)) {
String code=removej2.getText();
Dom4jManger.removeStudent(pathName, code);
JOptionPane.showMessageDialog(null, "删除成功!");
}
else {
JOptionPane.showMessageDialog(null, "该文档不存在");
}
}
});
/*表格双击事件*/
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {//当鼠标双击时响应
// TODO Auto-generated method stub
int row=table.getSelectedRow();//获取行
int column=table.getSelectedColumn();//获取列
int r=row+1;
int c=column+1;
Object value=table.getValueAt(row,column);
String info=r+"行"+c+"列";
JOptionPane.showMessageDialog(null, info);
}
});
}
public static void main(String[] args) {
XmlFrame xm=new XmlFrame();
xm.setVisible(true);
}
}
程序运行后:
进行新建功能测试:
找到工程目录查看:
成功创建!
用记事本打开后:
添加学生单位:
之后小编又添加了几个学生对象,查看原XML文档:
添加成功,之后浏览学生信息:
读取XML文档信息成功,之后还可以进行删除和修改学生信息的操作,有兴趣的小伙伴可以自己操作一下哦!
谢谢!