1、XML文件介绍
配置文件:用来保存设置的一些东西。
拿IDEA来举例,比如设置的背景图片,字体信息,字号信息和主题信息等等。
(1)以前是用txt保存的,没有任何优点,而且不利于阅读,因为只保存了值,而值所代表的含义却不清楚。
(2)后面又提出了properties文件,是以键值对的形式存储数据的,拿同一个信息来说,假如有多个用户的只需要存储,却只能用一个键值对来进行存储,无法为同一个信息配置多个键值对。
(3)所以现在来学习xml文件。xml文件可解决这个问题。
xml是可扩展的标记语言,那什么是可扩展?什么是标记语言?
标记就是标签。可扩展就是可以自定义标签。
下面是一个例子,可以很清楚地看到多个用户的不同信息。
2、XML文件基本语法
(1)XML文件的创建
文件后缀名为.xml,注意是小写的。
(2)XML文件的文档声明
第一行必须是文档声明,这个不需要去背,只需输入一个<,IDEA就会自动进行提示。
version:XML默认的版本号,该属性是必须存在的。
encoding:本XML文件的编码。
<?xml version="1.0" encoding="UTF-8" ?>
还有一点文档声明必须放在第一行顶格写,下面这两种不放在第一行和不顶格写都是错的。
(3)XML文件的标签规则
①标签必须成对出现,比如下面的student标签,且根标签只能有一个。
②也有一些特殊的单标签,比如<br/>。
③标签里面还可以有属性以及属性的值。
④标签中的文本内容,比如张三就是name标签的文本内容。
(4)XML文件的注释信息:<!- 注释内容 -->
不用记,只需要选中内容然后用IDEA的快捷键就可以了:crtl+shift。
(5)XML文件中的特俗符号
由于平常用来表示大于>、小于<等等的一些符号在XML文件中是用来表示标签的开始和结束的,所以提出了别的符号用来表示大于、小于这些。
(6)XML文件中的CDATA区
格式:<![CDATA[内容]]>
这种格式下的内容都会当成最原始的符号,不会有xml文件中的特殊意义,比如<就是小于的意思。
(7)代码书写要求
从左到右依次书写,当写完开始标签的>时会自动把结束标签补上。
3、XML文件的约束文档
由于XML文件可以自定义标签,如果随意定义会导致XML文件在解析时可能会出现问题。
为了避免这种情况的出现,就提出了一系列要求,强制程序员必须按照要求进行规定进行书写。
我们不用掌握约束文档怎么写,只需要根据给出的约束文档知道如何去编写XML文件就可以了。
约束分为两类:DTD和scheme。
(1)如何利用DTD约束文档编写一个符合要求的XML文件?
我们需要掌握的有3点:
①约束文档的格式为dtd。
②如何引入本地的dtd文件。
③如何根据约束书写XML文件。
(2)如何利用scheme约束文档编写一个符合要求的XML文件?
由于DTD约束文档没办法约束数据类型,所以提出了scheme约束文档。
(1)scheme约束文档的格式
scheme约束文档本身就是一个XML文件,也被其他的scheme约束文档所约束。
这是一个scheme约束文档的内容,其中需要学习的就是红色方框中的内容:
(2)如何引入scheme约束文档?
只需这一行就可以。
上面虽然讲了这么多,但真正需要掌握的就是把scheme约束文档复制到XML文件的目录下,然后输入<之后根据提示直接使用就可以了,都不需要写第二步。
4、XML文件的解析
解析XML文件就是读取文件中的数据。
解析的方式:Dom4j。
(1)Dom4j的解析方式
这种方式是读取整个XML文件之后,按照树形结构存储,大概就是下面图示的样子。以及需要掌握Doucument、Element、Attribute和Text4个对象的含义。
(2)如何使用Dom4j解析XML文件?
首先要想使用dom4j,就要先下载包,网址:DOM4J
还有一点就是从XML文件中解析完数据之后可以封装到对象中,要不然数据都是一个个零散的。
①比如有这样一个XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students>
<!--第一个学生信息-->
<student id="1">
<name>张三</name>
<age>23</age>
</student>
<!--第二个学生信息-->
<student id="2">
<name>李四</name>
<age>24</age>
</student>
</students>
②Student类:
public class Student {
private String id;
private String name;
private int age;
public Student() {
}
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
③利用dom4j去解析XML文件:
1.获取一个解析器对象;
2.利用解析器把xml文件加载到内存中,并返回一个文档对象;
3.获取到根标签;
4.通过根标签来获取student标签;
elements():可以获取调用者所有的子标签,并把这些子标签放到一个集合中返回。
elements("标签名"):可以获取调用者指定的所有子标签,并把这些子标签放到一个集合中并返回。
/**
* 利用dom4j解析xml文件
*/
public class XmlParse {
public static void main(String[] args) throws DocumentException {
//1.获取一个解析器对象
SAXReader saxReader = new SAXReader();
//2.利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new File("myxml\\xml\\student.xml"));
//3.获取到根标签
Element rootElement = document.getRootElement();
//4.通过根标签来获取student标签
//elements():可以获取调用者所有的子标签.会把这些子标签放到一个集合中返回.
//elements("标签名"):可以获取调用者所有的指定的子标签,会把这些子标签放到一个集合中并返回
//List list = rootElement.elements();
List<Element> studentElements = rootElement.elements("student");
//System.out.println(list.size());
//用来装学生对象
ArrayList<Student> list = new ArrayList<>();
//5.遍历集合,得到每一个student标签
for (Element element : studentElements) {
//element依次表示每一个student标签
//获取id这个属性
Attribute attribute = element.attribute("id");
//获取id的属性值
String id = attribute.getValue();
//获取name标签
//element("标签名"):获取调用者指定的子标签
Element nameElement = element.element("name");
//获取这个标签的标签体内容
String name = nameElement.getText();
//获取age标签
Element ageElement = element.element("age");
//获取age标签的标签体内容
String age = ageElement.getText();
// System.out.println(id);
// System.out.println(name);
// System.out.println(age);
Student s = new Student(id,name,Integer.parseInt(age));
list.add(s);
}
//遍历操作
for (Student student : list) {
System.out.println(student);
}
}
}
(3)后面又提出了Xpath,可以根据如何使用Xpath解析XML文件。
Xpath底层依赖dom4j,所以如果要使用Xpath的话记得也要导dom4j的包。
有4种解析方式:绝对路径检索、相对路径检索、全文检索以及属性检索。
以及提供两个检索方法:
①selectNodes("路径"):查询满足路径的所有
②selectSingleNodes("路径"):查询满足路径的一个,如果同时有多个满足,则返回第一个。
关于路径有4种:
首先先来介绍一下各个符号的含义:/表示单级路径,//表示多级路径,@表示属性。
1.绝对路径:从根标签开始。
2.相对路径:相对于当前标签的路径,而.就表示当前标签的路径。
3.全文检索
①//name:在整个xml文件种查找name这个标签
②//person/name和//person//name两个的区别:
//person/name:是查找到person标签以后,再找person的子标签是name的。
//person//name:无论name是子标签还是孙标签都可以。
4.属性检索
①//@属性名,比如//@id
②//元素[@属性名]:查找带有属性名的标签
③//元素[@属性名 = '值']:查找带有属性为某个值的标签