【超详细】一文掌握 XML 核心要点
jdom在dom基础上进行了封装dom4j又对jdom进行了封装pull主要在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件DOM4j是一个简单、灵活的开放源代码的库(用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,DOM4j使用接口和抽象基类,虽然DOM4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

文章目录
- XML指可扩展标记语言,被设计用来传输和存储数据,目前主要用来做配置
一、为什么需要XML
1.需求1:两个程序间进行数据通信
2.需求2:给一台服务器,做一个配置文件,当服务器程序启动时,去读取她应当监听的端口号、连接数据库的用户名和密码
3.能存储复杂的数据关系
<?xmlversion="1.0"encoding="UTF-8"?>
<贾府>
<贾演>
<贾代化>
<贾敬></贾敬>
</贾代化>
</贾演>
<贾源>
<贾代善>
<贾政></贾政>
</贾代善>
</贾源>
</贾府>
二、XML技术用于解决什么问题
1.解决程序间数据传输的问题→但目前json主流
比如qq之间的数据传送,用xml格式来传送数据,具有良好的可读性、可维护性
2.xml可以做配置文件
xml文件做配置文件非常普遍,比如tomcat服务器的server.xml、web.xml
3.xml可以充当小型的数据库→但很多程序有自己的数据格式存放
xml文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增强维护数据库工作),可以考虑直接用xml来做小型数据库,而且直接读取文件显然要比读取数据库快
三、XML快速入门
1.需求分析/图解
需求:使用idea创建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="001">
<name>jun</name>
<age>18</age>
<gender>男</gender>
</student>
<student id="002">
<name>mary</name>
<age>21</age>
<gender>女</gender>
</student>
</students>
四、XML语法
一个XML文件分为如下几部分内容:文档声明、元素、属性、注释、CDATA节、特殊字符
1.文档声明
(1)XML声明放在XML文档的第一行
(2)version——文档符合XML1.0规范,我们学习1.0
(3)encoding——文档字符编码。比如:“UTF-8”
2.元素
(1)元素语法要求
-
每个XML文档必须有且只有一个根元素
-
根元素是一个完全包括文档中其他所有元素的元素
-
根元素的起始标记要放在所有其他元素的起始标记之前
-
根元素的结束标记要放在所有其他元素的结束标记之后
-
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式
包含标签体:
<a>www.hsp.cn</a>不含标签体:
<a></a>, 简写为:<a/> -
一个标签中也可以嵌套若干个子标签,但所有标签必须合理的嵌套,绝对不允许交叉嵌套
-
student叫法:元素、节点、标签
(2)XML元素命名规则
- 区分大小写,例如
和
是两个不同的标记
- 不能以数字开头
- 不能包含空格
- 名称中间不能包含冒号(:)
- 如果标签单词之间需要间隔,建议使用下划线,比如:<book_name>java web</book_name>
3.属性
<student id="001">
<name>jun</name>
<age>18</age>
<gender>男</gender>
</student>
- 属性值用双引号(“)或单引号(‘)分隔(如果属性值有’,用"分隔;有”,用’分隔)
- 一个元素可以有多个属性,它的基本格式为:<元素名 属性名=“属性值”>
- 特定的属性名称在同一个元素标记中只能出现一次,比如:是错误的
- 属性值不能包括 & 字符,比如:是错误的
4.CDATA节
有些内容不想让解析引擎执行,而是当作原始内容处理(即当作普通文本),可以使用CDATA包括起来,CDATA节中的所有字符都会被当作简单文本,而不是XML标记。
- 语法
<![CDATA[
这里可以把你输入的字符原样显示,不会解析xml
]]>
- 可以输入任意字符(除]]>)
- 不能嵌套
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="001">
<name>jun</name>
<age>18</age>
<gender>男</gender>
</student>
<student id="002">
<name>mary</name>
<age>21</age>
<gender>女</gender>
<!--
举例说明:
下面是一段js的代码片段,直接放在<code></code>标签间,语法错误
使用CDATA节来处理即可
<script data-compress="strip">
function h(obj) {
obj.style.behavior='url(#default#homepage)';
var a = obj.setHomePage('//www.baidu.com/')
}
</script>
-->
<!--如果希望把某些字符串当作普通文本,使用CDATA包起来-->
<code>
<![CDATA[
<script data-compress="strip">
function h(obj) {
obj.style.behavior='url(#default#homepage)';
var a = obj.setHomePage('//www.baidu.com/')
}
</script>
]]>
</code>
</student>
</students>
格式正规的XML文档-小结
- XML声明语句<?xml version="1.0" encoding="UTF-8" ?>
- 必须有且仅有一个根元素
- 标记区分大小写
- 属性值用引号
- 标记成对
- 空标记要关闭
- 元素正确嵌套
五、转义字符
对于一些单个字符,若想显示其原始样式,可以使用转义的形式
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="001">
<name>jun</name>
<age>18</age>
<!--
使用转义字符表示一些特殊字符
<resume>年龄<100 &版权</resume>
-->
<gender>男</gender>
<resume>年龄<100 &版权</resume>
</student>
<student id="002">
<name>mary</name>
<age>21</age>
<gender>女</gender>
</student>
</students>
六、DOM4j
1.XML解析技术原理
(1)不管是html文件还是xml文件,它们都是标记型文档,都可以使用w3c组织指定的dom技术来解析
(2)document对象表示的是整个文档(可以是html文档,也可以是xml文档)
2.XML解析技术介绍
- jdom在dom基础上进行了封装
- dom4j又对jdom进行了封装
- pull主要在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件
3.DOM4j介绍
- DOM4j是一个简单、灵活的开放源代码的库(用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
- 与JDOM不同的是,DOM4j使用接口和抽象基类,虽然DOM4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
- DOM4j是一个非常优秀的Java XML API,具有性能优异。功能强大和极易使用的特点。现在很多软件采用的DOM4j。
- 使用DOM4j开发,需下载DOM4j相应的jar文件。
4.获取Document对象
在DOM4j中,获得Document对象的方式有三种
(1)读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/input.xml"));
(2)解析XML形式的文本,得到document对象
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
(3)主动创建document对象
Document document = DocumentHelper.createDocumen();
Element root = document.addElement("members");
5.应用实例
(1)加载XML文件
- src/students.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="01">
<name>小龙女</name>
<age>16</age>
<gender>女</gender>
<resume>古墓派掌门人</resume>
</student>
<student id="02">
<name>欧阳锋</name>
<age>18</age>
<gender>男</gender>
<resume>白驼山,蛤蟆神功</resume>
</student>
</students>
- Dom4j_.java
/**
* 演示如何加载XML文件
*/
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//Debug看document的对象属性
Document document = reader.read(new File("src/students.xml"));
System.out.println(document);
}

(2)遍历XML指定元素
/**
* 遍历所有的学生信息
*/
@Test
public void listStu() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.得到rootElement
Element rootElement = document.getRootElement();
//2.得到rootElement的student Elements
List<Element> students = rootElement.elements("student");
for (Element student: students) {//element就是student元素/节点
//3.获取student的各个元素
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());
}
}
(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.得到rootElement的第一个student Element
Element student = (Element)rootElement.elements("student").get(0);
//3.输出学生信息
System.out.println("学生信息: " + student.element("name").getText() + " " + student.element("age").getText() +
" " + student.element("gender").getText() + " " + student.element("resume").getText());
//4.输出student元素的属性
System.out.println("id=" + student.attributeValue("id"));
}
(4)增删改操作
/**
* 添加元素(要求:添加一个学生到xml中)【不要求掌握,使用少,了解即可】
*/
@Test
public void add() throws Exception {
//1.得到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个xml文件
Document document = reader.read(new File("src/students.xml"));
//首先创建一个学生节点对象
Element newStu = DocumentHelper.createElement("student");
newStu.addAttribute("id", "03");
//创建name元素
Element newStu_name = DocumentHelper.createElement("name");
newStu_name.setText("宋江");
//创建age元素
Element newStu_age = DocumentHelper.createElement("age");
newStu_age.setText("23");
//创建resume元素
Element newStu_resume = DocumentHelper.createElement("resume");
newStu_resume.setText("梁山老大");
//把三个子元素(节点)加到newStu下
newStu.add(newStu_name);
newStu.add(newStu_age);
newStu.add(newStu_resume);
//再把newStu节点加到根元素
document.getRootElement().add(newStu);
//直接输出会出现中文乱码
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
writer.write(document);
writer.close();
System.out.println("添加成功!");
}
/**
* 删除元素(要求:删除一个学生)【不要求掌握,使用少,了解即可】
*/
@Test
public void del() throws Exception {
//1.得到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个xml文件
Document document = reader.read(new File("src/students.xml"));
//找到该元素第三个学生
Element stu = (Element) document.getRootElement().elements("student").get(2);
//删除元素
stu.getParent().remove(stu);
//更新xml
//直接输出会出现中文乱码
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
writer.write(document);
writer.close();
System.out.println("删除成功!");
}
/**
* 更新元素(要求:把所有学生的年龄+3)【不要求掌握,使用少,了解即可】
*/
@Test
public void update() throws Exception {
//1.得到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个xml文件
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");
//String -> int + 3 -> String
age.setText((Integer.parseInt(age.getText()) + 3) + "");
}
//更新xml
//直接输出会出现中文乱码
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
writer.write(document);
writer.close();
System.out.println("更新成功!");
}
课后作业
根据给出的books.xml,创建对应的Book对象(有几个创建几个)
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id="100">
<name>天龙八部</name>
<author>金庸</author>
<price>23.4</price>
</book>
<book id="200">
<name>三国演义</name>
<author>罗贯中</author>
<price>50.4</price>
</book>
</books>
1.遍历所有的book元素→得到每个book元素的信息
2.创建一个Book类,根据book元素信息来创建book对象
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 +
'}';
}
}
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;
public class Homework {
public static void main(String[] args) throws DocumentException {
//1.得到解析器
SAXReader reader = new SAXReader();
//2.指定解析哪个xml文件
Document document = reader.read(new File("src/books.xml"));
Element rootElement = document.getRootElement();
//3.遍历所有book元素
List<Element> books = rootElement.elements("book");
for (Element book : books) {
//4.取出book元素的所有信息
String id = book.attributeValue("id");
String name = book.element("name").getText();
String author = book.element("author").getText();
String price = book.element("price").getText();
//创建Book对象
Book bk = new Book();
bk.setId(Integer.parseInt(id));
bk.setName(name);
bk.setAuthor(author);
bk.setPrice(Double.parseDouble(price));
System.out.println(bk);
}
}
}
book : books) {
//4.取出book元素的所有信息
String id = book.attributeValue(“id”);
String name = book.element(“name”).getText();
String author = book.element(“author”).getText();
String price = book.element(“price”).getText();
//创建Book对象
Book bk = new Book();
bk.setId(Integer.parseInt(id));
bk.setName(name);
bk.setAuthor(author);
bk.setPrice(Double.parseDouble(price));
System.out.println(bk);
}
}
}
更多推荐


所有评论(0)