一. XML(Xtensible Markup Language):可扩展标记语言
定义:可扩展的标记语言
作用:XML独立于软件和硬件的信息传输的方式,常用于简化数据的存储和共享
XML的相关处理指令:
处理指令用于指挥处理引擎如何解析XML文档内容
<?xml version="1.0" encoding="utf-8"?>
- xml: 处理指令名称
- version: 版本信息
- ecoding: 编码
XML的组成
XML文档中包含xml元素,元素值的是从开始标签到结束标签,元素可以包含其他元素,文本,元素也可以有属性,属性提供关于元素的额外信息。
元素(标记,标签)
样本:
<a>
<b></b>
<c id = "1001"></c>
</a>
- XML文档只有一个根元素(不被其他元素包裹的)
- 元素必须有开始标签和结束标签
- XML对大小写敏感
- 属性值必须加上引号
例如,下面的名为Student.xml文件(放在src路径之下):
<?xml version="1.0" encoding="UTF-8"?>
<list>
<student id = "1">
<name>jektong</name>
<age>21</age>
<money>3000</money>
</student>
<student id = "2">
<name>tom</name>
<age>22</age>
<money>2000</money>
</student>
<student id = "3">
<name>jerry</name>
<age>23</age>
<money>1000</money>
</student>
</list>
XML的解析方式
- DOM解析
全称:Document Object Model(文档对象模型)
DOM解析器在解析XML文档时会把文档中全部的元素按照出现的层次结构关系解析形成一个个对象节点
优点:把XML文档在内存中形成一个树形结构,可以遍历和修改节点
缺点: 如果文档过大,内存压力比较大,解析花费时间较长 - SAX解析
全称: Simple APIs for XML
XML简单应用程序接口
相比与DOM,SAX速度更快,更有效的解析方式,逐行扫描文件,一边扫描一边解析,可以文档中任意时刻停止解析
缺点:不能对节点修改 - JDOM解析
特点:仅仅使用具体类而不是接口
API大量使用Collections类 - DOM4j解析
开源的,基于JAVA库进行解析XML
具有性能优异灵活性好,功能强大和易用的特点
一般使用DOM4j进行解析XML文件,需要导入DOM4j的jar包
操作:
-
读取XML文档
对象:SAXReader reader = new SAXReader();
读指定的XML
Document document = reader.read(new File(filepath));
Document
文档树的根,可以提供对文档数据最初的访问入口,获取根元素Element
Element element = document.getRootElement();
XML文档中元素,元素可以包含其他元素,文本,属性
获取当前根元素下全部子元素
List<Element> root.elements();
获取当前元素指定名字的属性,Attribute用于描述一个元素的某一个属性
Attribute attribute(String name);
获取当前属性的属性值
String getValue();
获取元素的文本内容
String elementText(String name);
准备一个Student.java
的实体类:
/**
* @author jektong
* @Date 2020-8-14 15:37:03
*/
public class Student {
private int id;
private String name;
private int age;
private int money;
public Student() {
super();
}
public Student(int id, String name, int age, int money) {
super();
this.id = id;
this.name = name;
this.age = age;
this.money = money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ",
money=" + money + "]";
}
}
用程序读取Student.xml文件中的内容
@Test
public void testRead() {
try {
//读指定的文件
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/Student.xml"));
//获取根元素
Element rootElement = document.getRootElement();
//获取全部的子元素
List<Element> elements = rootElement.elements();
List<Student> stus = new ArrayList<>();
for (Element element : elements) {
//属性值
int id = Integer.parseInt(element.attribute("id").getValue());
//文本
String name = element.elementText("name");
int age = Integer.parseInt(element.elementText("age"));
int money = Integer.parseInt(element.elementText("money"));
//对象
Student stu = new Student(id,name,age,money);
stus.add(stu);
}
for (Student student : stus) {
System.out.println(student);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
运行结果:
-
写入XML
创建并返回Document对象DoucmentHelper.createDocument();
向当前文档中添加根元素并返回此元素,此方法只调用一次
document.addElement(String name);
向当前元素中添加指定名字的子元素
Element addElement(String name);
向当前元素添加指定属性和属性值,返回当前元素
Element addAttribute(String name, String value);
向当前元素添加指定的文本内容
Element addText(String text);
通过XMLWriter将文档输出生成XML文件
XMLWriter writer = new XMLWriter();
writer.setOutputStream(new FileOutputStream(""));
writer.writer(document);
writer.close();
现在我们将对象写入XML文件
@Test
public void testWrite() {
//构造模拟数据
List<Student> stus = new ArrayList<>();
stus.add(new Student(1001, "周杰伦", 45, 2000));
stus.add(new Student(1002, "刘德华", 42, 2000));
stus.add(new Student(1003, "古天乐", 40, 2000));
//创建并返回Document对象
Document document = DocumentHelper.createDocument();
//添加根元素
Element root = document.addElement("stuList");
//遍历集合数据,创建子节点
for (Student student : stus) {
//子元素
Element element = root.addElement("stu");
//子元素加属性
element.addAttribute("stuId", student.getId()+"");
//加文本
element.addElement("stuName").addText(student.getName());
element.addElement("stuAge").addText(student.getAge() + "");
element.addElement("stuMoney").addText(student.getMoney() +"");
}
try {
//输出
XMLWriter writer = new XMLWriter();
//输出到指定的目录,文件不存在则会自动创建
writer.setOutputStream(new FileOutputStream("src/StudentList.xml"));
//内容写入对象
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
生成的StudentList.xml
文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<stuList>
<stu stuId="1001">
<stuName>周杰伦</stuName>
<stuAge>45</stuAge>
<stuMoney>2000</stuMoney>
</stu>
<stu stuId="1002">
<stuName>刘德华</stuName>
<stuAge>42</stuAge>
<stuMoney>2000</stuMoney>
</stu>
<stu stuId="1003">
<stuName>古天乐</stuName>
<stuAge>40</stuAge>
<stuMoney>2000</stuMoney>
</stu>
</stuList>
以后学习框架的时候,只需要导入约束就可以使用内部的标签了。