JavaWeb系列四: XML 和 DOM4J
xml学习
文章目录

xml入门
xml新建
1.新建java项目, 项目名xml
2.新建 students.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--
老韩解读
1 xml :表示该文件的类型 xml
2 version="1.0"版本
3 encoding="UTF-8" 文件编码
4. students: root元素/根元素, 程序员自己来定
5. <student></student> 表示students一个子元素, 可以有多个
6. id就是属性 name, age, gender 是student元素的子元素
-->
<students>
<student id="100">
<name>jack</name>
<age>10</age>
<gender>男</gender>
</student>
<student id="200">
<name>mary</name>
<age>18</age>
<gender>女</gender>
</student>
</students>
文档声明
- XML声明放在XML文档的第一行
- XML声明由以下几个部分组成:
- version=“1.0” 文档符合XML1.0规范, 我们学习1.0
- encoding=“utf-8” 文件字符编码
元素
- 空标签 <a/>是允许的;
- <student> 标签/元素/节点, 叫法是一样的;
- <Email>和<email>是两个不同的标记. 区分大小写;
- 标签不能嵌套;
- 标签不能以数字开头;
- 不能包含空格, 可用下划线分隔;
- 不能包含冒号 :
属性
- id = ‘1’ 单引号也是正确写法;
- 如果属性值有" 则用’包括, 比如 id=“00’1”; 如果属性值有’ 则用"包括, 比如 id=‘00"1’
- 属性名在同一个元素标记中只能出现一次<student id=‘01’ id=‘02’>是错误的
- 属性值不能包含 &字符, 可以包含其它特殊字符
CDATA节
如果希望把某些字符串, 当作普通文本, 使用CDATA包括
<!--如果希望把某些字符串, 当作普通文本, 使用CDATA包括-->
<![CDATA[
<student id="002">
<name>mary</name>
<age>22</age>
<gender>女</gender>
</student>
]]>
转义字符
转义符 | 符号 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
格式正确的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/
5.本地文档: dom4j-1.6.1\docs\index.html
6.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
public class Dom4j_ {
/**
* 演示如何加载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);
}
}
debug分析
遍历xml指定元素
public class Dom4j_ {
/**
* 遍历所有的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");
//文本在节点的Text属性里, 要获取Student元素 的属性id
System.out.println("学生信息= " + student.attribute("id") + name.getText() + " " + age.getText() +
" " + resume.getText() + " " + gender.getText());
}
}
}
读取指定xml元素
public class Dom4j_ {
/**
* 指定读取第一个学生的信息 就是 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(0);
//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"));
}
}
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();
}
作业
public class Homework {
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);
}
}
}
更多推荐
所有评论(0)