XML
1、为什么需要XML
(1)需求1:两个进程间进行数据通信
(2)需求2:这一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
(3)Spring中的ico配置文件,beans.xml mybatis xxxMapper.xml tomcat server.xml web.xml maven pom.xml
(4)能存储复杂的数据关系
2、XML技术用于解决什么问题?
3、XML快速入门
1、需求:使用idea创建student.xml存储多个学生信息
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student id="100">
<name>jack</name>
<age>20</age>
<gender>男</gender>
</student>
<student id="200">
<name>marry</name>
<age>18</age>
<gender>女</gender>
</student>
</students>
4、XML语法
(1)一个XML文件分为如下几部分内容
- 文档说明
- 元素
- 属性
- 注释
- CDATA区、特殊字符,后面会说
(2)文档说明
<?xml version="1.0" encoding="utf-8" ?>
-
XML声明放在XML文档的第一行
- XML声明由以下几部分组成
- version--文档符合xml1.0规范
- encoding="utf-8"--文档字符编码
(3)元素
1、元素语法要求
- 每个xml文档必须有且只有一个根元素
- 根元素是一个完全包括文档中其他所有元素的元素
- 根元素的起始标记要放在所有其他元素的起始标记之前
- 根元素的结束标记要放在所有其他元素的结束标记之后
- xml元素指xml文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式:
包含标签体:<a>www.baidu.com</a>
不含标签体:<a></a>,简写为:<a/>
- 一个标签中也可以嵌套若干子标签,但所有标签必须合理嵌套,绝不允许交叉嵌套
2、xml元素命名规则
- 区分大小写,例如
he
是两个不同的标记
- 不能以数字开头
- 不能包含空格
- 名称中间不能包含冒号:
- 如果标签间需要间隔,建议使用下划线,比如<book_name></book_name>
(4)属性
1、属性介绍
<student id="100">
<name>tom</name>
</student>
2、属性值用双引号(“”)或者单引号(‘’)分隔。(如果属性值中有’‘,用"“分隔;如果属性值中有”",用’'分隔)
3、一个元素可以有多个属性,他的基本格式为:<元素名 属性名=“属性值”>
4、特定的属性名称在同一个元素标记中只能出现一次
5、属性值不能包括&字符
(5)注释
(6)CDATA节
有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可 以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记
1、语法
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
2、可以输入任意字符(除]]>外)
3、不能嵌套
(7)转义字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
<Students>
<student>
<name>tom</name>
<age>18</age>
<resume>年龄<10</resume>
</student>
</Students>
(8)xml小结
遵循如下规则的 XML 文档称为格式正规的 XML 文档:
- XML 声明语句 <?xml version="1.0" encoding="utf-8"?>
- 必须有且仅有一个根元素
- 标记大小,区分大小写的
- 属性值用引号
- 标记成对
- 空标记关闭
- 元素正确嵌套
5、DOM4j
(1)介绍
(2)DOM4j中,获得Document对象的方式有三种
这里第一个最常用。
(3)应用实例
1、使用DOM4j对students.xml文件进行增删改查
- 重点说查询(遍历和指定查询)
- xml增删改使用较少
2、引入dom4j 的jar包
在idea项目中创建lib文件夹用来存放jar包,把相应的jar包复制到lib文件夹下。
右击jar包添加到库中。这样就完成了jar包的引入。
3、创建students.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student id="01">
<name>小龙女</name>
<gender>女</gender>
<age>16</age>
<resume>古墓派掌门人</resume>
</student>
<student id="02">
<name>欧阳锋</name>
<gender>男</gender>
<age>18</age>
<resume>白驼山,蛤蟆神功</resume>
</student>
</students>
4、创建dom4j.java演示对xml文件的增删改查/遍历
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import java.io.*;
import java.util.List;
/**
* @author D
* @version 1.0
* @project XML
* @description
* @date 2024/6/4 19:21:07
*/
public class dom4j_ {
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
System.out.println(document);
}
//遍历所有的student信息
@Test
public void listStus() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
//得到rootElement
Element rootElement = document.getRootElement();
//得到rootElement的student Element
List<Element> students = rootElement.elements("student");
//System.out.println(student.size());
for (Element student : students) { //element就是student元素/节点
//获取student元素的name...
Element name = student.element("name");
Element age = student.element("age");
Element gender = student.element("gender");
Element resume = student.element("resume");
System.out.println("学生信息="+name.getText()+" "+age.getText()+
" "+gender.getText()+" "+resume.getText());
}
}
//指定获取第一个学生的信息 就是dom4j+xpath
@Test
public void readOne() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
//得到rootElement
Element rootElement = document.getRootElement();
//获取第一个学生
Element student =(Element) rootElement.elements("student").get(1);
System.out.println("该学生信息:"+student.element("name").getText()+" "+
student.element("gender").getText()+" "+
student.element("age").getText()+" "+
student.element("resume").getText());
//获取对应id
System.out.println("id="+student.attributeValue("id"));
}
//添加元素
@Test
public void add() throws DocumentException, IOException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
Element newStu = DocumentHelper.createElement("student");
Element newStu_name = DocumentHelper.createElement("name");
Element newStu_gender = DocumentHelper.createElement("gender");
Element newStu_age = DocumentHelper.createElement("age");
Element newStu_resume = DocumentHelper.createElement("resume");
//赋值
newStu.addAttribute("id","03");
newStu_name.setText("Ghost-D");
newStu_gender.setText("男");
newStu_age.setText("20");
newStu_resume.setText("略");
//将子节点加入到newStu下
newStu.add(newStu_name);
newStu.add(newStu_gender);
newStu.add(newStu_age);
newStu.add(newStu_resume);
//将newStu加入到根节点
document.getRootElement().add(newStu);
//更新xml
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码 utf-8
//把我们的 xml 文件更新
// lets write to a file
//new FileOutputStream(new File("src/myClass.xml"))
//使用到 io 编程 FileOutputStream 就是文件字节输出流
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
}
//删除元素
@Test
public void del() throws DocumentException, IOException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
//得到要删除的节点
Element stu =(Element) document.getRootElement().elements("student").get(2);
//删除
stu.getParent().remove(stu);
//更新xml
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码 utf-8
//把我们的 xml 文件更新
// lets write to a file
//new FileOutputStream(new File("src/myClass.xml"))
//使用到 io 编程 FileOutputStream 就是文件字节输出流
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
System.out.println("删除成功");
}
//修改
@Test
public void update() throws IOException, DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\students.xml"));
//得到所有学生的年龄
List<Element> students = document.getRootElement().elements("student");
//遍历
for (Element student : students) {
//取出年龄
Element age = student.element("age");
age.setText((Integer.parseInt(age.getText())+3)+"");
}
//更新xml
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码 utf-8
//把我们的 xml 文件更新
// lets write to a file
//new FileOutputStream(new File("src/myClass.xml"))
//使用到 io 编程 FileOutputStream 就是文件字节输出流
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
System.out.println("修改成功");
}
}
5、课后作业
创建books.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<books>
<book id="bj001">
<name>天龙八部</name>
<auther>金庸</auther>
<price>23.4</price>
</book>
<book id="bj002">
<name>三国演义</name>
<auther>罗贯中</auther>
<price>50.4</price>
</book>
</books>
创建java文件:
package homework;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* @author D
* @version 1.0
* @project XML
* @description
* @date 2024/6/5 14:57:43
*/
public class homework01 {
public static void main(String[] args) throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug一下
Document document = reader.read(new File("src\\homework\\books.xml"));
//获取book对象
List<Element> books = document.getRootElement().elements("book");
for (Element book : books) {
String name = book.element("name").getText();
String auther = book.element("auther").getText();
double price = Double.parseDouble(book.element("price").getText());
String id = book.attribute("id").getText();
homework.book book1 = new book();
book1.setId(id);
book1.setName(name);
book1.setAuther(auther);
book1.setPrice(price);
System.out.println(book1);
}
}
}
class book{
private String id;
private String name;
private String auther;
private double price;
public book() {
}
public book(String id, String name, String auther, double price) {
this.id = id;
this.name = name;
this.auther = auther;
this.price = price;
}
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 String getAuther() {
return auther;
}
public void setAuther(String auther) {
this.auther = auther;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", auther='" + auther + '\'' +
", price=" + price +
'}';
}
}
public void setAuther(String auther) {
this.auther = auther;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", auther='" + auther + '\'' +
", price=" + price +
'}';
}
}