地址: https://www.w3school.com.cn/xml/index.asp
<贾府>
<贾演>
<贾代化>
<贾敬>贾敬>
贾代化>
贾演>
<贾源>
<贾代善>
<贾政>贾政>
贾代善>
贾源>
贾府>
● 解决程序间数据传输的问题:=> json
比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
● xml 可以做配置文件
xml 文件做配置文件可以说非常的普遍,比如我们的 tomcat 服务器的 server.xml ,web.xml
● xml 可以充当小型的数据库 => 程序自己的数据格式存放
xml 文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用 xm 来做小型数据库 ,而且直接读取文件显然要比读取数据库快
需求: 使用 idea 创建 students.xml 存储多个学生信息
<students>
<student id="100">
<name>jackname>
<age>10age>
<gender>男gender>
student>
<student id="200">
<name>maryname>
<age>18age>
<gender>女gender>
student>
students>
1、文档声明
2、元素
3、属性
4、注释
5、CDATA 区 、特殊字符, 后面会说
1、XML 声明放在 XML 文档的第一行
2、XML 声明由以下几个部分组成:
www.sohu.cn
, 简写为:
welcome to www.sohu.org
应用实例:
创建 students02.xml:
<students>
<student id="100">
<name>jackname>
<age>10age>
<gender>男gender>
student>
<student id="200">
<name>maryname>
<age>18age>
<gender>女gender>
student>
<school>清华大学school>
<city/>
students>
和
是两个不同的标记。hello
创建 语法/students03.xml
<students>
<student id="100">
<name>jackname>
<age>10age>
<gender>男gender>
<email>[email protected]email>
<Email>[email protected]Email>
<job>java工程师job>
<book_name>三国book_name>
student>
<student id="200">
<name>maryname>
<age>18age>
<gender>女gender>
student>
students>
<Student ID="100">
<Name>TOMName>
Student>
属性应用实例
students04.xml
<students>
<student id="100">
<name>jackname>
<age>10age>
<gender>男gender>
student>
<student id="200">
<name>maryname>
<age>18age>
<gender>女gender>
student>
students>
>TOM
说明: 有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记。
应用实例
cdata_student.xml
<students>
<stduent id="01">
<name>tomname>
<gender>男gender>
<age>18age>
stduent>
<stduent id="02">
<name>scottname>
<gender>女gender>
<age>17age>
<code>
function h(obj){
obj.style.behavior='url(#default#homepage)';
var a = obj.setHomePage('//www.baidu.com/');
}
]]>
code>
stduent>
students>
<students>
<stduent id="01">
<name>tomname>
<gender>男gender>
<age>28age>
<resume>年龄<10 > &resume>
stduent>
<stduent id="02">
<name>scottname>
<gender>女gender>
<age>17age>
stduent>
students>
遵循如下规则的 XML 文档称为格式正规的 XML 文档:
1、XML 声明语句
2、必须有且仅有一个根元素
3、标记大小,区分大小写的. 4、属性值用引号
5、标记成对
6、空标记关闭
7、元素正确嵌套
文档: https://dom4j.github.io/javadoc/1.6.1/
● 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介
● 第三方的 XML 解析技术
● 说明:dom4j 的文档在解压后 docs\index.html
● 开发 dom4j 要导入 dom4j 的包
1、读取 XML 文件,获得 document 对象
SAXReader reader = new SAXReader(); //创建一个解析器
Document document = reader.read(new File("src/input.xml"));//XML Document
2、解析 XML 形式的文本,得到 document 对象.
String text = " ";
Document document = DocumentHelper.parseText(text);
3、主动创建 document 对象.
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
<students>
<student id="01">
<name>小龙女name>
<gender>女gender>
<age>19age>
<resume>古墓派掌门人resume>
student>
<student id="02">
<name>欧阳锋name>
<gender>男gender>
<age>21age>
<resume>白驼山,蛤蟆神功resume>
student>
students>
document源码分析图
演示 Dom4j 对 xml 文件的增删改查/遍历
/**
* 演示如何加载xml文件
*/
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//老师的代码技巧->debug 看看document对象的属性
//分析了document对象的底层结构 如上图
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对象的底层结构
Document document = reader.read(new File("src/students.xml"));
//1. 得到rootElement, 你是OOP
Element rootElement = document.getRootElement();
//2. 得到rootElement的student Elements
List<Element> students = rootElement.elements("student");
//System.out.println(student.size());//2
for (Element student : students) {//element就是Student元素/节点
//获取Student元素 的name Element
Element name = student.element("name");
Element age = student.element("age");
Element resume = student.element("resume");
Element gender = student.element("gender");
System.out.println("学生信息= " + name.getText() + " " + age.getText() +
" " + resume.getText() + " " + gender.getText());
}
}
/**
* 指定读取第一个学生的信息 就是 dom4j+xpath
*/
@Test
public void readOne() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//老师的代码技巧->debug 看看document对象的属性
//分析了document对象的底层结构
Document document = reader.read(new File("src/students.xml"));
//1. 得到rootElement, 你是OOP
Element rootElement = document.getRootElement();
//2. 获取第一个学生
Element student = (Element) rootElement.elements("student").get(1);
//3. 输出该信息
System.out.println("该学生的信息= " + student.element("name").getText() + " " +
student.element("age").getText() + " " + student.element("resume").getText() +
student.element("gender").getText());
//4. 获取student元素的属性
System.out.println("id= " + student.attributeValue("id"));
}
/**
* 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
* @throws Exception
*/
@Test
public void add() throws Exception {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/students.xml"));
//首先我们来创建一个学生节点对象
Element newStu = DocumentHelper.createElement("student");
Element newStu_name = DocumentHelper.createElement("name");
//如何给元素添加属性
newStu.addAttribute("id", "04");
newStu_name.setText("宋江");
//创建age元素
Element newStu_age = DocumentHelper.createElement("age");
newStu_age.setText("23");
//创建resume元素
Element newStu_intro = DocumentHelper.createElement("resume");
newStu_intro.setText("梁山老大");
//把三个子元素(节点)加到 newStu下
newStu.add(newStu_name);
newStu.add(newStu_age);
newStu.add(newStu_intro);
//再把newStu节点加到根元素
document.getRootElement().add(newStu);
//直接输出会出现中文乱码:
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();
}
/**
* //删除元素(要求:删除第一个学生) 使用少,了解
* @throws Exception
*/
@Test
public void del() throws Exception {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/students.xml"));
//找到该元素第一个学生
Element stu = (Element) document.getRootElement().elements("student").get(2);
//删除元素
stu.getParent().remove(stu);
// //删除元素的某个属性
// stu.remove(stu.attribute("id"));
//更新xml
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码utf-8
//把我们的xml文件更新
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
System.out.println("删除成功~");
}
/**
* //更新元素(要求把所有学生的年龄+3) 使用少,了解
* @throws Exception
*/
@Test
public void update() throws Exception {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/students.xml"));
//得到所有学生的年龄
List<Element> students = document.getRootElement().elements("student");
//遍历, 所有的学生元素的age+3
for (Element student : students) {
//取出年龄
Element age = student.element("age");
age.setText((Integer.parseInt(age.getText()) + 3) + "");
}
//更新
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码utf-8
//把我们的xml文件更新
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
System.out.println("更新成功~");
}
books.xml
<books>
<book id="100">
<name>西游记name>
<author>吴承恩author>
<price>80price>
book>
<book id="200">
<name>三国name>
<author>罗贯中author>
<price>100price>
book>
books>
Book.java
public class Book {
private Integer id;
private String name;
private String author;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
Homework.java
public static void main(String[] args) throws DocumentException {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/books.xml"));
//3.遍历所有的book元素
List<Element> books = document.getRootElement().elements("book");
for (Element book : books) {
//取出book元素的所有信息
Element name = book.element("name");
Element author = book.element("author");
Element price = book.element("price");
String id = book.attributeValue("id");
//创建成Book对象
Book book1 = new Book();
book1.setId(Integer.parseInt(id));
book1.setName(name.getText());
book1.setPrice(Double.parseDouble(price.getText()));
book1.setAuthor(author.getText());
System.out.println("book1对象信息= " + book1);
}
}