34、Java——一个案例学会Dom4j解析技术对XML文件的增删改查
✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:乐趣国学的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一个案例学会Dom4j解析技术对XML文件的增删改查
案例
使用Dom4j解析技术实现对animal.xml文件进行增删改查操作。
链接: dom4j包下载
将dom4j的jar包导入到项目中,然后build path后使用。
解析XML文档
读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。
初始化animal.xml文件数据:
<animal>
<dog>
<name>旺财</name>
<age>3</age>
</dog>
<cat>
<name>tom</name>
<age>2</age>
</cat>
</animal>
创建“增删改查”操作类:Dom4jXMLMgr类
导包
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
创建Document对象
public static Document doc;
将xml文件转换成Document对象;其中,saxReader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就代表了整个XML。
根据本人自己的经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。
public static void loadDocument() {
try {
SAXReader saxReader = new SAXReader();
doc = saxReader.read(new File("animal.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
每一次操作后保存xml
public static void saveXML(String path) {
try {
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码
format.setEncoding("GBK");
XMLWriter writer;
writer = new XMLWriter(new FileWriter(path), format);
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
取得Root节点
读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。
向animal.xml文件中增加数据
public static void addNewAnimalInfo() {
// 获取XML的根节点
Element root = doc.getRootElement();
// 创建新的动物标签:pig
Element el = root.addElement("pig");
// 创建name标签
Element nameEl = el.addElement("name");
// 给name标签添加文本信息
nameEl.addText("佩奇");
// 创建age标签
Element ageEl = el.addElement("age");
// 给age标签设置文本信息
ageEl.addText("4");
saveXML("animal.xml");
}
从animal.xml文件中删除数据
public static void deleteAnimalInfo(String animalText) {
// 获取XML的根节点
Element root = doc.getRootElement();
int id = 0;
for (Iterator animal = root.elementIterator(); animal.hasNext();) {
Element theAnimal = (Element) animal.next();
if (theAnimal.getName().equals(animalText)) {
theAnimal.getParent().remove(theAnimal);
}
}
saveXML("animal.xml");
}
从animal.xml文件中修改数据
public static void updateAnimalInfo(String animalText2, String property,
String propertyValue) {
// 获取XML的根节点
Element root = doc.getRootElement();
int id = 0;
for (Iterator animal = root.elementIterator(); animal.hasNext();) {
Element theAnimal = (Element) animal.next();
// 判断当前动物和传过来的动物是不是一个,满足则修改并退出循环
if (theAnimal.getName().equals(animalText2)) {
// 遍历每个动物标签
for (Iterator oneAnimal = theAnimal.elementIterator(); oneAnimal
.hasNext();) {
Element type = (Element) oneAnimal.next();
if (type.getName().equals(property)) {
//设置新的属性值
type.setText(propertyValue);
}
}
}
}
saveXML("animal.xml");
}
查询animal.xml文件中所有的动物数据
public static void showAnimalInfo() {
// 获取XML的根节点
Element root = doc.getRootElement();
// 遍历所有的动物标签
for (Iterator animal = root.elementIterator(); animal.hasNext();) {
Element theAnimal = (Element) animal.next();
// 输出标签的name属性
System.out.println("动物:" + theAnimal.getName());
// 遍历每个动物标签
for (Iterator oneAnimal = theAnimal.elementIterator(); oneAnimal
.hasNext();) {
Element type = (Element) oneAnimal.next();
// 输出标签的name属性
System.out.println(type.getName() + ":" + type.getText());
}
System.out.println("********************");
}
System.out.println("----------当前操作所有数据----------");
}
}
创建测试类:Dom4jXMLTest类
导包:键盘输入数据,用Scanner;
Scanner sc = new Scanner(System.in);
初始化,将xml保存到Document对象里。
Dom4jXMLMgr.loadDocument();
查询所有动物
Dom4jXMLMgr.showAnimalInfo();
增加数据
Dom4jXMLMgr.addNewAnimalInfo();
查询所有动物
Dom4jXMLMgr.showAnimalInfo();
删除数据
System.out.println(“请输入需要删除的动物(如dog,cat等):”);
String animalText1 = sc.next();
Dom4jXMLMgr.deleteAnimalInfo(animalText1);
查询所有动物
Dom4jXMLMgr.showAnimalInfo();
修改数据
System.out.println(“请输入需要修改的动物(如dog,cat等):”);
String animalText2 = sc.next();
System.out.println(“请输入需要修改的属性(name/age):”);
String property = sc.next();
System.out.println(“请输入新的属性值:”);
String propertyValue = sc.next();
Dom4jXMLMgr.updateAnimalInfo(animalText2, property, propertyValue);
查询所有动物
Dom4jXMLMgr.showAnimalInfo();