介绍
官网:XML 教程
为什么需要:
- 需求 1 : 两个程序间进行数据通信?
- 需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码。
- spring 中的 ico 配置文件,beans.xml 、mybatis XXXMapper.xml 、 tomcat server.xml web.xml 、maven pom.xml
- 能存储复杂的数据关系
解决问题:
- 1)解决程序间数据传输的问题:=> json
- 比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
- 2)xml 可以做配置文件
- xml 文件做配置文件可以说非常的普遍
- 比如我们的 tomcat 服务器的server.xml ,web.xml
- 3)xml 可以充当小型的数据库
- 程序自己的数据格式存放
- 直接读取文件显然要比读取数据库快
- 程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作)
xml
创建
File -> New ->Project ->java ->New Project ->New ->File ->文件名.xml
组成
1、文档声明
<?xml version="1.0" encoding="utf-8"?>
说明
- 1、XML 声明放在 XML 文档的第一行
- 2、XML 声明由以下几个部分组成:
- version - -文档符合XML1.0 规范,我们学习 1.0
- encoding - -文档字符编码,比如"utf-8"
2、元素
语法: 每个XML文档必须有且只有一个根元素。
根元素
- 是一个完全包括文档中其他所有元素的元素
- 起始标记要放在所有其他元素的起始标记之前
- 结束标记要放在所有其他元素的结束标记之后
XML 元素/标签/节点
- 指XML 文件中出现的标签
- 一个标签分为开始标签和结束标签
- 一个标签中也可以嵌套若干子标签。
- 但所有标签必须合理的嵌套,绝对不允许交叉嵌
书写形式
- 包含标签体:<a>www.sohu.cn</a>
- 不含标签体的:<a></a>, 简写为:<a/>
命名规则
- 区分大小写;例如,<P>和<p>是两个不同的标记
- 不能以数字开头。
- 不能包含空格。
- 名称中间不能包含冒号(:)
- 如果标签单词需要间隔,建议使用下划线; 比如 <book_title>hello</book_title>
3、属性
基本格式: <元素名 属性名="属性值">
说明
- 属性值用双引号(")或单引号(')分隔;如果属性值中有',用"分隔;有",用'分隔。
- 一个元素可以有多个属性。
- 特定的属性名称在同一个元素标记中只能出现一次。
- 属性值不能包括& 字符。
<Student ID="100">
<Name>TOM</Name>
</Student>
4、注释
语法格式: <!--这是一个注释- ->
说明
- 注释内容中不要出现- -;
- 不要把注释放在标记中间;错误写法 <Name <!--the name-->>TOM</Name>。
- 注释不能嵌套;
- 可以在除标记以外的任何地方放注释
5、CDATA 区 、特殊字符
语法
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
说明:
- 可以输入任意字符(除]]>外)
- 不能嵌套
- 有些内容不想让解析引擎执行, 而是当作原始内容处理(即当做普通文本), 可以使用 CDATA 包括起来, CDATA 节中的所有字符都会被当作简单文本, 而不是 XML 标记
实例1:
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="01">
<name>小龙女</name>
<gender>女</gender>
<age>19</age>
<resume>古墓派掌门人</resume>
</student>
<student id="02">
<name>欧阳锋</name>
<gender>男</gender>
<age>21</age>
<resume>白驼山,蛤蟆神功</resume>
</student>
</students>
DOM4j
介绍
官网:dom4j 1.6.1 API
一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。
使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性
一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。
使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。
注意:xml常用来查询(遍历和指定查询),删改使用少,作为扩展。
获取document对象的3种方式
1、读取 XML 文件,获得 document 对象
//创建一个解析器
SAXReader reader = new SAXReader();
//XML Document
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.createDocument();
Element root = document.addElement("members");
常用API
attributes 返回该元素的属性列表
attributeValue 根据传入的属性名获取属性值
elementIterator 返回包含子元素的迭代器
elements 返回包含子元素的列表
应用实例
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="01">
<name>小龙女</name>
<gender>女</gender>
<age>19</age>
<resume>古墓派掌门人</resume>
</student>
<student id="02">
<name>欧阳锋</name>
<gender>男</gender>
<age>21</age>
<resume>白驼山,蛤蟆神功</resume>
</student>
</students>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
public class Dom4j_ {
/**
* 演示如何加载xml文件
*/
@Test
public void loadXML() throws DocumentException {
// 得到一个解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
System.out.println(document); // org.dom4j.tree.DefaultDocument@887af79
}
/**
* 遍历所有的student信息
*/
@Test
public void listStus() throws DocumentException {
// 得到一个解析器
SAXReader reader = new SAXReader();
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();
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("更新成功~");
}
}