XML:
xml文件是一种配置文件,用来保存程序在运行时需要的一些参数
三种配置文件:
.txt文件、.properties文件、.xml文件
优缺点:
TXT文件:
优点:无
缺点:不利于阅读
properties文件:
优点:键值对形式易于阅读,解析简单
缺点:无法配置一组一组的数据
XML文件:
优点:易于阅读,可以配置成组出现的数据
缺点:解析比较复杂
适用情况:
数据量较少,一个键只对应一个值,使用properties
数据量较多,使用xml
XML概述:
XML全称为(EXtensible Markup Language),是一种可扩展的标记语言(通过标签(元素)描述数据的语言)。
XML作用:
用户存储数据和传输数据
作为软件的配置文件
XML的标签(元素)规则:
XML的其他组成:
关于第一点,注释信息可以采用快捷键Ctrl+/或Ctrl+Shift+/。
关于第二点,XML文件中这几个符号<>' " &都有其自身含义,所以采用前面那串字符表示对应符号。
关于第三点,内容部分中,所有符号都可以写,写什么就是什么,不会有歧义
XML文件格式:
文件后缀必须是xml
文档声明必须是第一行
必须存在一个根标签,有且只能有一个
XML文件编写:
文档约束:
文档约束是用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件
文档约束分类:
1.DTD
约束步骤
DTD编写:
在xml文件中引入DTD:
2.schema
可以约束具体的数据类型,约束功能更加强大
它本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨
约束步骤:
schema编写:
<?xml version="1.0" encoding="UTF-8" ?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.cn/javase"
elementFormDefault="qualified"
>
<!--定义persons复杂元素-->
<element name="persons">
<complexType>
<sequence>
<!--定义person复杂元素-->
<element name = "person">
<complexType>
<sequence>
<!--定义name和age简单元素-->
<element name = "name" type = "string"></element>
<element name = "age" type = "string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
在xml文件中引入schema:
在xml文件第二行写上<根标签名 xmlns="schema文件中的targetNameSpace的网址">
(当.xsd文件以及在项目中存在,那么在xml文件中写完第一行文档声明,第二行打左括号就会自动弹出提示)
XML文件的解析技术
有SAX和DOM两种,DOM是目前使用较多的
DOM常见的解析工具
重点是Dom4j下面重点介绍它
Dom4j解析思想
解析练习
将xml文件中的学生信息全部转变成学生对象封装到集合中并打印
xml文件代码:
<?xml version="1.0" encoding="UTF-8" ?>
<Students>
<Student id="1">
<name>han</name>
<age>21</age>
</Student>
<Student id="1">
<name>zhao</name>
<age>21</age>
</Student>
<Student id="1">
<name>ma</name>
<age>22</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;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{id = " + id + ", name = " + name + ", age = " + age + "}";
}
}
测试类:
public class DomDemo1 {
public static void main(String[] args) throws DocumentException {
//创建集合存储Student对象
ArrayList<Student> list = new ArrayList<>();
//创建解析器对象
SAXReader saxReader = new SAXReader();
File file = new File("C:\\Users\\Han\\IdeaProjects\\mylogback\\src\\a.xml");
//获取xml文件的Document对象
Document document = saxReader.read(file);
//获取根标签
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());
System.out.println("------------------------");
//获取根标签的子标签
List<Element> elements1 = rootElement.elements();
for (Element element : elements1) {
System.out.println(element.getName());
}
System.out.println("------------------------");
//获取指定的子标签
List<Element> elements2 = rootElement.elements("Student");
for (Element element : elements2) {
System.out.println(element.getName());
}
System.out.println("------------------------");
//继续获取更里面的内容
for (Element element : elements2) {
//属性id
Attribute id = element.attribute("id");
String idValue = id.getText();
//标签name
Element name = element.element("name");
String nameValue = name.getText();
//标签age
Element age = element.element("age");
int ageValue = Integer.parseInt(age.getText());
//变成Student对象添加到集合
list.add(new Student(idValue,nameValue,ageValue));
}
//打印集合
list.stream().forEach(s -> System.out.println(s));
}
}
运行结果
XML文件的检索技术
如果需要从XML文件中检索需要的某个信息(如:name),使用Dom4j需要进行文件的全部解析,然后再寻找数据,很麻烦
而这种情况使用XPath技术则更加适合。
XPath介绍:
使用路径表达式来定位XML文档中的元素节点或属性节点
使用XPath检索xml文件:
代码演示(绝对路径搜索):
xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<Students>
<Student id="1">
<name>han</name>
<age>21</age>
</Student>
<Student id="1">
<name>zhao</name>
<age>21</age>
</Student>
<Student id="1">
<name>ma</name>
<age>22</age>
</Student>
</Students>
测试类:
public class XPathDemo1 {
public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
File file = new File("C:\\Users\\Han\\IdeaProjects\\mylogback\\src\\a.xml");
Document document = saxReader.read(file);
List<Node> nodes = document.selectNodes("/Students/Student");
for (Node node : nodes) {
System.out.println(node);
}
}
}
运行结果:
关于上面代码查找时的表达式,还有以下几种形式