可扩展标记语言
用于数据存储、配置文件、数据传输
一、XML约束(dtd约束)
1、创建一个student.dtd约束文件
<?xml version="1.0" encoding="UTF-8"?>
//名字为student的xml文件下 只能有students的标签
<!ELEMENT student (students*) >
//students的标签里面必须要有name password标签
<!ELEMENT students (name,password ) >
//声明标签的类型 #PCDATA代表字符串
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
//ATTLIST代表属性 代表students标签要有number的属性
<!ATTLIST student number ID #REQUIRED>
2、在xml添加约束
<?xml version="1.0" encoding="UTF-8"?>
<!-- 关联dtd约束文件 -->
<!DOCTYPE student SYSTEM "student.dtd">
二、xml解析(DOM4J解析)
读取xml文件内的意思
第一步 导入包
用于dom4j所需的包
用于单元测试用到的包
下载地址:链接:https://pan.baidu.com/s/1j_3R7LxgXhx0BlX0aGh6jw 密码:49o0
第二步:新建books.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 number= "600">
<书名>数学</书名>
<作者>数学作者</作者>
<出版社>数学出版社</出版社>
<价格>数学价格</价格>
</书>
<书 number= "100">
<书名>英语</书名>
<作者>英语作者</作者>
<出版社>英语出版社</出版社>
<价格>英语价格</价格>
</书>
<书 number= "50">
<书名>语文</书名>
<作者>语文作者</作者>
<出版社>语文出版社</出版社>
<价格>语文价格</价格>
</书>
</书架>
第三步:在java文件中解析books.xml文件
package demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* 单元测试:Jinit (相当于主方法) 需导入junit包
* 1.单元测试方法的名字都是test开头
* @author Administrator
*
*/
public class demo01 {
@Test
public void test01() throws Exception {
//使用dom4j对books.xml文件进行 sax解析 需要导入dom4j包
//1、创建reader对象
SAXReader reader = new SAXReader();
//2、读取 读取完返回的是一个文档对象
Document doc = reader.read(new FileInputStream("books.xml"));
//3.获取根标签
Element root = doc.getRootElement();
System.out.println("根标签的名字:" + root.getName()); //控制台输出 书架
//4.获取子标签
List books = root.elements();
//遍历子标签
for(Object obj : books) {
Element book = (Element) obj; //将obj转为Element对象
System.out.println(book.getName()); //控制台输出: 书
//获取书名
System.out.println(book.element("书名").getText()); //直接通过名字去获取(获取书名标签内的内容)
//获取作者
System.out.println(book.element("作者").getText());
//获取出版社
System.out.println(book.element("出版社").getText());
//获取价格
System.out.println(book.element("价格").getText());
//获取"书"标签下面的属性
System.out.println("剩余" + book.attributeValue("number") + "本书");
}
}
}
三、dom4j的xpath查询(XPATH规则)
专门用于xml文件查询 相当于定义了一种规则
第一步 导入包
在使用XPATH之前 需要导入包
链接:https://pan.baidu.com/s/115qAu52sb_bLEVbjrFVfAA 密码:99e6
第二步 创建解析器
SAXReader reader = new SAXReader();
第三步 解析xml获得Document对象
Document document = reader.read(url);
实例 进行XPATH操作(xml文件创建完成的前提下)
XPTH规则
//书 | 直接找到全部书名这个节点 |
/书架/书/作者 | 从跟节点一步一步查找作者节点 |
.. | 选取当前节点的父节点。 |
//书/@number | 获取书节点中的Number属性 |
@Test
public void test02() throws Exception {
SAXReader reader = new SAXReader(); //创建解析器
Document doc = reader.read(new FileInputStream("books.xml"));
//进行XPATH查询
//查询单个节点
Node nodee = doc.selectSingleNode("//书名"); //直接找到xml文件下的第一个书名这个节点
System.out.println(nodee.getText()); //输出的内容为"数学"
//查询多个节点
List nodes = doc.selectNodes("//书名"); //直接找到全部书名这个节点
for(Object obj : nodes) {
Node node = (Node) obj; //将obj类型默认转为Node类型
System.out.println(node.getText()); //获取标签内容
}
/* 输出的内容为
* 数学
数学
英语
语文*/
//从跟节点一步一步查找作者节点 用 /
//找到第一个作者节点
Node authorNode = doc.selectSingleNode("/书架/书/作者");
System.out.println("作者节点" + authorNode.getText()); // 输出内容作者节点数学作者
//找作者节点的父节点
Node authorfatherNode = authorNode.selectSingleNode("..");
System.out.println("作结节点的父节点为:" + authorfatherNode.getName()); //书
}
@Test
public void test03() throws DocumentException {
// @选取属性的使用
//1、创建SAXRreader解析器
SAXReader reader = new SAXReader();
Document doc = reader.read("books.xml"); //需要抛出Document异常
//2、获取xml文件内某个节点的属性
Node node = doc.selectSingleNode("//书/@number");//获取书节点中的Number属性
//3、类型转换
Attribute att =(Attribute) node;
System.out.println(att.getValue()); //输出内容为600(即为第一个书节点下的Number属性值)
}
四、xml的DOM4J修改节点并保存操作
XMLWriter对象
XMLWriter writer = new XMLWriter(new FileOutputStream("books.xml"));
writer.write(doc); //写入
public class demo02 {
//xml的DOM4J修改节并保存点操作
@Test
public void test() throws Exception{
//1、创建SAXReader解析器
SAXReader reader = new SAXReader();
//2、解析XML文件 获得Document对象
Document doc = reader.read("books.xml");
//3、把所有书标签内的number的值改为1000
List list = doc.selectNodes("//书/@number");
for(Object obj:list) {
//对象是不是Attribute类型
if(obj instanceof Attribute) {
//获取属性对象
Attribute att = (Attribute) obj;
//修改属性值
att.setValue("1000");
}
}
//4、保存修改
XMLWriter writer = new XMLWriter(new FileOutputStream("books.xml"));
writer.write(doc); //写入
writer.close();
}