文章目录
1. xml入门
1.1 xml新建
1.1 文档声明
- XML声明放在XML文档的第一行
- XML声明由以下几个部分组成:
- version=“1.0” 文档符合XML1.0规范, 我们学习1.0
- encoding=“utf-8” 文件字符编码
1.2 元素
- 空标签 <a/>是允许的;
- <student> 标签/元素/节点, 叫法是一样的;
- <Email>和<email>是两个不同的标记. 区分大小写;
- 标签不能嵌套;
- 标签不能以数字开头;
- 不能包含空格, 可用下划线分隔;
- 不能包含冒号 :
1.3 属性
- id = ‘1’ 单引号也是正确写法;
- 如果属性值有" 则用’包括, 比如 id=“00’1”; 如果属性值有’ 则用"包括, 比如 id=‘00"1’
- 属性名在同一个元素标记中只能出现一次<student id=‘01’ id=‘02’>是错误的
- 属性值不能包含 &字符, 可以包含其它特殊字符
1.4 CDATA节
如果希望把某些字符串, 当作普通文本, 使用CDATA包括
<!--如果希望把某些字符串, 当作普通文本, 使用CDATA包括-->
<![CDATA[
<student id="002">
<name>mary</name>
<age>22</age>
<gender>女</gender>
</student>
]]>
1.5 转义字符
转义符 | 符号 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
1.6 格式正确的XML
- XML声明语句<?xml version=“1.0” encoding=“utf-8”?>
- 必须有且仅有一个根元素
- 标记大小写
- 属性值用引号
- 标记成对
- 标记记得关闭
- 元素正确嵌套
DOM4J
DOM4J介绍
1.Dom4j
是一个简单, 灵活的开放源代码的库(用于解析 / 处理XML
文件). Dom4j
是由早期开发JDOM
的人分离出来而后独立开发的.
2.与JDOM
不同的是, dom4j
使用接口和抽象基类, 虽然Dom4j
的API
相对要复杂一些, 但它提供了比JDOM
更好的灵活性.
3.Dom4j
是一个非常优秀的Java XML API
, 具有性能优异, 功能强大和极易使用的特点. 现在很多软件采用的Dom4j
.
4.使用Dom4j
开发, 需下载dom4j
相应的jar
文件.
文档: https://dom4j.github.io/javadoc/1.6.1/
本地文档: dom4j-1.6.1\docs\index.html
Dom4j中, 获得Document对象的三种方式
1.读取XML
文件, 获得document
对象
SAXReader reader = new SAXReader(); //创建解析器
Document document = read.read(new File(“src/input.xml”)); //XML Document
2.解析XML
形式的文本, 得到document
对象
String text = “<members></members>;”
Documeng document = DocumentHelper.parseText(text);
3.主动创建document
对象
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement(“members”);
Dom4j应用实例
1.使用DOM4J
堆students.xml
文件进行增删改查
- 重点讲解查询(遍历和指定查询)
xml
增删改使用少, 作为扩展, 给出案例
2.xml 项目下新建lib文件夹, 引入dom4j
依赖的jar
包 dom4j-1.6.1.jar
3.右键该jar包, 点击Add As Library
4.创建src/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>
5.src/Dom4j_.java
代码
2.2 遍历xml指定元素
2.3 读取指定xml元素
/*指定读取第一个学生的信息*/
@Test
public void readOne() throws DocumentException {
//获取解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.获取rootElement
Element rootElement = document.getRootElement();
//2.获取第一个学生
Element student = (Element) rootElement.elements("student").get(0);
//3.遍历student元素的节点并输出各个子节点的Text属性
Element name = student.element("name");
Element age = student.element("age");
Element gender = student.element("gender");
System.out.println("name=" + name.getText() + " age=" + age.getText() + " gender=" + gender.getText());
//4.获取指定 student元素/节点 的属性值
System.out.println("id=" + student.attributeValue("id"));
}
2.4 获取属性
attributeValue
获取指定 student元素/节点 的属性值
System.out.println("id=" + student.attributeValue("id"));
2.5 dom4j增删改
- 添加
/*添加一个学生节点到xml文件中*/
@Test
public void add() throws DocumentException, IOException {
//1.拿到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个Xml文件
Document document = reader.read(new File("src/students.xml"));
//3.首先创建一个学生节点对象
Element student = DocumentHelper.createElement("student");
// 创建name, age, gender子节点
Element student_name = DocumentHelper.createElement("name");
Element student_age = DocumentHelper.createElement("age");
Element student_gender = DocumentHelper.createElement("gender");
// 如何给元素添加属性
student.addAttribute("id", "003");
student_name.setText("威震天");
student_age.setText("40000");
student_gender.setText("机器族");
//4.把三个子元素添加到student节点下
student.add(student_name);
student.add(student_age);
student.add(student_gender);
// 再把student节点挂载到rootElement下
document.getRootElement().add(student);
// 直接输出会中文乱码
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//5.使用到IO编程 文件字节输出流
XMLWriter Writer =
new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
Writer.write(document);
Writer.close();
}
- 删除
/*删除元素 删除最后一个学生信息*/
@Test
public void delete() throws DocumentException, IOException {
//1.拿到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个Xml文件
Document document = reader.read(new File("src/students.xml"));
//3.找到最后一个学生节点
Element student = (Element) document.getRootElement().elements("student").get(2);
//拿到父节点 删除元素
student.getParent().remove(student);
//直接输出会中文乱码
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
//更新Xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
}
- 修改
/*修改元素(所有元素的age+3)*/
@Test
public void update() throws DocumentException, IOException {
//1.拿到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个Xml文件
Document document = reader.read(new File("src/students.xml"));
//3.拿到所有的student元素
List<Element> students = document.getRootElement().elements("student");
//遍历
for (Element student : students) {
//设置所有学生的年龄
Element age = student.element("age");
age.setText(Integer.parseInt(age.getText()) + 3 + "");
}
//直接输出会中文乱码
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
//4.IO流 文件字节输出流
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/students.xml")), output);
writer.write(document);
writer.close();
}
2.6 作业
//1.拿到解析器
SAXReader reader = new SAXReader();
//2.指定解析books.xml文件
Document document = reader.read(new File("src/books.xml"));
//拿到rootElement下的 book元素
List<Element> books = document.getRootElement().elements("book");
ArrayList<Book> list = new ArrayList<>();
Book book1 = null;
int id = 0;
String name = "";
String author = "";
double price = 0;
//循环遍历 book节点
for (Element book : books) {
id = Integer.parseInt(book.attributeValue("id"));
name = book.element("name").getText();
author = book.element("author").getText();
price = Double.parseDouble(book.element("price").getText());
book1 = new Book(id, name, author, price);
list.add(book1);
}
for (int i = 0; i < list.size(); i++) {
Book book = list.get(i);
System.out.println("编号 " + book.getId() + "\t\t作者 " + book.getAuthor() +
"\t\t书名 " + book.getName() + "\t\t价格 " + book.getPrice());
}