1、XML是什么
xml是Extensible Markup Language的缩写,可扩展标记语言。由程序编写者自定义实现,xml主要用来以标记的文本形式表示一组或多组数据,很多计算机语言都提供对xml文件的解析,使用xml文件格式传递数据可以实现跨平台计算机编程语言,xml是W3C组织推荐的数据交换格式标准。
XML是一种数据交换的格式标准。
2、XML的语法
- 标准声明为:
<?xml version ="1.0" encoding = "UTF-8"?>
- 标签应封闭,像html标签那样。
- 大小写敏感,如message标签和Message标签是完全不同的。
- 至少有一个根元素。
- 属性值必须带引号。
- 实体引用:
< 表示 <
>表示 >
&表示 &
&apos表示 单引号
"表示 双引号 - xml中的注释:
<!--This is a content-->。
- xml元素:xml中的元素以尖括号成对出现,如
<student></student>
,有开始标签必须有关闭标签,成对出现。 - xml属性:xml中属性是用来描述元素特征的,必须由名称和值组成,之间用=实现赋值,属性值必须带引号,当属性值本身带有双引号时,必须用单引号或使用实体符号表示双引号。
3、Java写入和读取XML文件
以下介绍使用Jdom和Dom4j这两种方法来对XML文件进行读写。先将依赖包加进来:
这两个包一定要build到path中去。
(1)使用Dom4j
dom4j是由第三方提供的扩展子JDOM API的一组解析XML文件的Java实现,只和Java相关。dom4j对XML文件的解析与jdom类似,是将XML文档中的每个节点(node)称之为Element(元素),并提供对元素上下级元素的获取方法。以下用代码实现读取和写入。
a、dom4j写入XML
首先准备好实体类,如下:
public class Person {
private String code;
private String name;
private String sex;
private Date birthday;
public Person() {
}
//构造方法
public Person(String code,String name,String sex,Date birthday) {
this.code = code;
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
建立一个工具类,里面定义写入和读取的方法,如下:
/*
* dom4j的工具类
*/
public class Dom4jManager {
//获取文档工厂实例
private static final DocumentFactory documentFactory = DocumentFactory.
getInstance();
//定义方法,写入XMl文件
public static void toXMLFromPerson(List<Person> pers,String fileName) {
//创建文档对象
Document document = documentFactory.createDocument("utf-8");
//创建XML文件的根节点
Element element = documentFactory.createElement("persons");
//文档设置根节点
document.setRootElement(element);
//遍历集合,将集合中的对象添加到XML文件
if(pers != null && pers.size()!=0) {
for(Person p:pers) {
//创建一级子节点
Element oneElement = documentFactory.createElement("person");
//创建一级子节点下的code节点
Element code = documentFactory.createElement("code");
//为code节点设置文本值
code.setText(p.getCode());
//创建一级子节点下的name节点
Element name = documentFactory.createElement("name");
//为name节点设置文本值
name.setText(p.getName());
//创建一级子节点下的sex节点
Element sex = documentFactory.createElement("sex");
//设置文本值
sex.setText(p.getSex());
//创建一级子节点下的birthday节点
Element birthday = documentFactory.createElement("birthday");
//日期格式转成文本
String birthdayStr = new SimpleDateFormat("yyyy-MM-dd").format(p.getBirthday());
//设置文本值
birthday.setText(birthdayStr);
//一级节点添加子节点
oneElement.add(code);
oneElement.add(name);
oneElement.add(sex);
oneElement.add(birthday);
//根节点添加一级子节点
element.add(oneElement);
}
//定义XML文件的输出路径
String path = "F:/Users/Administrator/Desktop";
File file = new File(path + "/" + fileName);
try {
//文件写入对象
Writer writer = new FileWriter(file);
//XML写入对象
XMLWriter xmlWriter = new XMLWriter(writer,OutputFormat.createPrettyPrint());
//写入xml文档
xmlWriter.write(document);
//关闭流
xmlWriter.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("XML写入成功,请查看!");
}
}
}
下面测试写入:
public class TestDom4jWrite {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<Person> list = new ArrayList<>();
System.out.println("请输入员工信息:");
System.out.println("-------------------------------");
while (true) {
System.out.println("请输入员工编号:");
String code = in.next();
System.out.println("请输入员工姓名:");
String name = in.next();
System.out.println("请输入员工性别:");
String sex = in.next();
System.out.println("请输入员工生日年份:");
int year = in.nextInt();
System.out.println("请输入员工生日月份:");
int month = in.nextInt();
System.out.println("请输入员工生日天数:");
int day = in.nextInt();
//日期转换
Calendar calendar = Calendar.getInstance();
calendar.set(year, month-1, day);
Date birth = calendar.getTime();
Person person = new Person(code, name, sex, birth);// 实例化对象
list.add(person);// 添加到集合
System.out.println("继续输入请输入1,结束请输入其他数字:");
int temp = in.nextInt();
if (temp != 1) {// 不等于1则跳出循环
break;
}
}
String fileName = "person.xml";// 要保存的xml文件名称
Dom4jManager.toXMLFromPerson(list, fileName);// 调用方法保存
}
}
执行,控制台输入以下内容:
请输入员工信息:
-------------------------------
请输入员工编号:
10001
请输入员工姓名:
猿A
请输入员工性别:
男
请输入员工生日年份:
1994
请输入员工生日月份:
10
请输入员工生日天数:
11
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10002
请输入员工姓名:
猿B
请输入员工性别:
男
请输入员工生日年份:
1990
请输入员工生日月份:
9
请输入员工生日天数:
2
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10002
请输入员工姓名:
猿C
请输入员工性别:
男
请输入员工生日年份:
1994
请输入员工生日月份:
8
请输入员工生日天数:
14
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
10003
请输入员工姓名:
猿D
请输入员工性别:
男
请输入员工生日年份:
1889
请输入员工生日月份:
4
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
2
XML写入成功,请查看!
查看桌面:
打开这个文件查看内容:
写入成功了。
下面总结一下dom4j写入XML文件的流程:
- 获取文档工厂实例。
- 创建文档对象。
- 创建XML文件的根节点。
- 文档设置根节点。
- 创建一级子节点,创建一级子节点下的子节点,子节点赋值。
- 一级子节点添加子节点,根节点添加一级子节点。
- 创建文件写入对象和XML写入对象,写入XML文件。
- 关闭流。
b、dom4j读取XML
在Dom4jManager中添加以下内容:
//定义方法,读取XML文件
public static List<Person> readXML(String fileName){
//容器
List<Person> persons = new ArrayList<Person>();
//XML所在目录
String path = "F:/Users/Administrator/Desktop";
//文件对象
File file = new File(path + "/" + fileName);
try {
//文件输入流对象
Reader reader = new FileReader(file);
//创建SAXReader对象
SAXReader saxReader = new SAXReader();
//读取,返回文档对象
Document document = saxReader.read(reader);
if(document != null) {
//获取根节点
Element element = document.getRootElement();
//获取根节点下的所有一级子节点
List<Element> eles = element.elements();
for(Element e:eles) {
Person per = new Person();
//获取code值
String code = e.element("code").getText();
//对象赋值
per.setCode(code);
//获取name值
String name = e.element("name").getText();
per.setName(name);
//获取sex值
String sex = e.element("sex").getText();
per.setSex(sex);
//获取birthday值
String birthStr = e.element("birthday").getText();
//转换成日期格式
Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthStr);
per.setBirthday(birthday);
persons.add(per);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return persons;
}
测试读取:
public class TestDom4jRead {
public static void main(String[] args) {
String fileName = "person.xml";
List<Person> list = Dom4jManager.readXML(fileName);
for(Person p:list) {
System.out.println(p.getCode() + "=======>" + p.getName() + "=======>"
+ p.getSex() + "=======>" + p.getBirthday());
}
}
}
执行,控制台:
那么读取成功了。
dom4j读取XML的流程为:
- 创建文件输入流对象。
- 创建SAXReader对象。
- SAXReader对象读取流对象,返回文档对象。
- 获取根节点。
- 获取根节点下的所有一级子节点。
- 获取一级子节点下的节点值,最后封装成对象。
(2)使用jdom
JDOM是一种使用 XML(标准通用标记语言下的一个子集) 的独特Java工具包,它的设计包含Java语言的语法乃至语义。JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。Jdom是用Java语言读、写、操作XML的新API函数。
a、jdom写入XML
建立新的工具类,如下:
/*
* jdom工具类
*/
public class JdomManager {
private static XMLOutputter xmlOutputter = null;
//定义方法,写入XML文件
public static void writeXML(List<Person> pers,String fileName) throws IOException {
//创建根节点
Element element = new Element("persons");
//创建文档对象
Document document = new Document();
//文档设置根节点
document.addContent(element);
if(pers !=null && pers.size()!=0) {
for(Person p:pers) {
//创建一级子节点
Element oneElement = new Element("person");
//创建一级子节点下的code节点
Element code = new Element("code");
//为code节点设置文本值
code.setText(p.getCode());
//创建一级子节点下的name节点
Element name = new Element("name");
//为name节点设置文本值
name.setText(p.getName());
//创建一级子节点下的sex节点
Element sex = new Element("sex");
//设置文本值
sex.setText(p.getSex());
//创建一级子节点下的birthday节点
Element birthday = new Element("birthday");
//日期格式转成文本
String birthdayStr = new SimpleDateFormat("yyyy-MM-dd").format(p.getBirthday());
//设置文本值
birthday.setText(birthdayStr);
//一级节点添加子节点
oneElement.addContent(code);
oneElement.addContent(name);
oneElement.addContent(sex);
oneElement.addContent(birthday);
//根节点添加一级子节点
element.addContent(oneElement);
}
}
//文件保存路径
String path = "F:/Users/Administrator/Desktop";
File file = new File(path + "/" + fileName);
FileOutputStream fileOutputStream = new FileOutputStream(file);
//获取XMLOutputter对象
XMLOutputter xmlOutputter = getXmlOutputter();
//写入XML文件
xmlOutputter.output(document, fileOutputStream);
//关闭流
fileOutputStream.close();
System.out.println("XML文件创建完成!");
}
//获取XMLOutputter对象
private static XMLOutputter getXmlOutputter() {
if(xmlOutputter == null) {
xmlOutputter = new XMLOutputter();
}
return xmlOutputter;
}
}
测试XML写入:
public class TestJdomWrite {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<Person> list = new ArrayList<>();
System.out.println("请输入员工信息:");
System.out.println("-------------------------------");
while (true) {
System.out.println("请输入员工编号:");
String code = in.next();
System.out.println("请输入员工姓名:");
String name = in.next();
System.out.println("请输入员工性别:");
String sex = in.next();
System.out.println("请输入员工生日年份:");
int year = in.nextInt();
System.out.println("请输入员工生日月份:");
int month = in.nextInt();
System.out.println("请输入员工生日天数:");
int day = in.nextInt();
//日期转换
Calendar calendar = Calendar.getInstance();
calendar.set(year, month-1, day);
Date birth = calendar.getTime();
Person person = new Person(code, name, sex, birth);// 实例化对象
list.add(person);// 添加到集合
System.out.println("继续输入请输入1,结束请输入其他数字:");
int temp = in.nextInt();
if (temp != 1) {// 不等于1则跳出循环
break;
}
}
String fileName = "person2.xml";// 要保存的xml文件名称
Dom4jManager.toXMLFromPerson(list, fileName);// 调用方法保存
}
}
执行,在控制台输入以下内容:
请输入员工信息:
-------------------------------
请输入员工编号:
code001
请输入员工姓名:
高富帅
请输入员工性别:
男
请输入员工生日年份:
1990
请输入员工生日月份:
9
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
code002
请输入员工姓名:
白富美
请输入员工性别:
女
请输入员工生日年份:
1994
请输入员工生日月份:
9
请输入员工生日天数:
10
继续输入请输入1,结束请输入其他数字:
1
请输入员工编号:
code003
请输入员工姓名:
路人甲
请输入员工性别:
男
请输入员工生日年份:
1997
请输入员工生日月份:
2
请输入员工生日天数:
12
继续输入请输入1,结束请输入其他数字:
2
XML写入成功,请查看!
查看桌面:
打开xml文件查看内容:
那么写入成功了,其实可以看到,jdom和dom4j写入XML的流程基本相同,只是用到的类不同方法略有差异。
b、jdom读取XML
在JdomManager工具类中添加以下内容:
private static SAXBuilder saxBuilder = null;
//定义方法,读取XML文件
public static List<Person> readXML(String fileName){
//容器
List<Person> persons = new ArrayList<Person>();
//XML所在目录
String path = "F:/Users/Administrator/Desktop";
//文件对象
File file = new File(path + "/" + fileName);
try {
//文件输入流对象
Reader reader = new FileReader(file);
//获取SAXBuilder对象
SAXBuilder saxBuilder = getSaxBuilder();
//读取,返回文档对象
Document document = saxBuilder.build(file);
if(document != null) {
//获取根节点
Element element = document.getRootElement();
//获取根节点下的所有一级子节点
List<Element> eles = element.getChildren();
for(Element e:eles) {
Person per = new Person();
//获取code值
String code = e.getAttribute("code").getValue();
//对象赋值
per.setCode(code);
//获取name值
String name = e.getAttribute("name").getValue();
per.setName(name);
//获取sex值
String sex = e.getAttribute("sex").getValue();
per.setSex(sex);
//获取birthday值
String birthStr = e.getAttribute("birthday").getValue();
//转换成日期格式
Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthStr);
per.setBirthday(birthday);
persons.add(per);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return persons;
}
//获取SAXBuilder对象
private static SAXBuilder getSaxBuilder() {
if(saxBuilder == null) {
saxBuilder = new SAXBuilder();
}
return saxBuilder;
}
测试读取:
public class TestJdomRead {
public static void main(String[] args) {
String fileName = "person2.xml";
List<Person> list = Dom4jManager.readXML(fileName);
for(Person p:list) {
System.out.println(p.getCode() + "=======>" + p.getName() + "=======>"
+ p.getSex() + "=======>" + p.getBirthday());
}
}
}
执行,控制台输出:
那么读取成功了,可以看到,jdom和dom4j读取XML文件的流程也基本相同,只是使用的类和方法不同,步骤都一样。
4、总结
对XML文件进行读写操作肯定还有其他的方法,但是掌握Jdom和Dom4j这两种工具应该够用了,学会对XML文件的读取和写入,以后工作中肯定会用的到。