Java 使用 Dom4j 解析XML
今天给大家分享一个我刚学到的、、、如何使用Dom4j解析XML文件
环境准备
(1)下载dom4j-2.1.1.jar
(2)JDK 1.8以上
(3)我用的IDEA(大家随意)
Dom4j解析XML的含义
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作
Dom4j解析XML的过程
首先,我们写一个XML文件,然后对他进行一系列操作
info.xml 代码如下
<?xml version="1.0" encoding="UTF-8"?>
<phoneInfo>
<brand name="小米">
<type name="小米8"/>
<type name="小米9"/>
<type name="小米MIX"/>
</brand>
<brand name="iphone">
<type name="IPhoneX"/>
<type name="IPhoneXs"/>
<type name="IPhone7"/>
</brand>
<brand name="华为">
<type name="P20"/>
<type name="P30"/>
<type name="P30 pro"/>
</brand>
</phoneInfo>
有了xml文件后,我们就可以对他进行一系列操作了
我们先在控制台进行对xml文件的读取
我们先建一个测试类Test.class
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
//读取xml文件,生成document对象
Document document = saxReader.read("src/info.xml");
Element rootElement = document.getRootElement();
System.out.println("根节点的名字:"+rootElement.getName());
//获取子节点列表
Iterator it = rootElement.elementIterator();
while (it.hasNext()){
Element firstChild = (Element) it.next();
System.out.println(firstChild.getName());
//获取节点的属性值
System.out.println(firstChild.attribute("name").getValue());
//获取子节点的下一级节点
Iterator iterator = firstChild.elementIterator();
while (iterator.hasNext()){
Element element = (Element) iterator.next();
System.out.println("\t"+element.attributeValue("name"));
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
运行结果如下:
然后我们再建一个AddTest.class
进行添加数据
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
public class AddTest1 {
public static void main(String[] args){
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/info.xml");
Element rootElement = document.getRootElement();
//添加一个子节点
Element brand = rootElement.addElement("brand");
//给当前节点添加属性
brand.addAttribute("name","魅族");
Element type = brand.addElement("type");
type.addAttribute("name","s16");
OutputStream os = new FileOutputStream(new File("src/info.xml"));
XMLWriter xmlWriter = new XMLWriter(os);
xmlWriter.write(rootElement);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们打开自己的xml文件,查看是否发生了变化
有了这句话就对了,然后我们再建一个UpdateTest.class
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
public class updataTest {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/info.xml");
//获取根节点
Element rootElement = document.getRootElement();
Iterator it = rootElement.elementIterator();
while(it.hasNext()){
Element element = (Element) it.next();
System.out.println(element.attributeValue("name"));
if (element.attributeValue("name").equals("魅族")){
Iterator iterator = element.elementIterator();
while (iterator.hasNext()){
Element type = (Element) iterator.next();
if (type.attributeValue("name").equals("s16")){
type.addAttribute("name","16 pro");
}
}
}
}
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlWriter.write(document);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
成功后我们就可以做接下来的删除了
我们再建个删除类DeleteTest
package cn.kgc.dom4jtest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
/**
* lxl
* 删除测试
*/
public class DeleteTest {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read("src/info.xml");
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
while(iterator.hasNext()){
Element brand = (Element) iterator.next();
if (brand.attributeValue("name").equals("魅族")){
//通过父节点删除子节点
brand.getParent().remove(brand);
}
}
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlWriter.write(document);
xmlWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们运行成功后可以看一下我们的XML,会发现里面就剩一个根目录了,不要慌,删了就对了
最后,我给大家封装了一个读取XML文件的方法,方便大家使用
public void List(Element root){
System.out.println("根节点的姓名:"+root.getName());
//获取子节点列表
Iterator it = root.elementIterator();
while (it.hasNext()){
Element fristChild = (Element) it.next();
System.out.println(fristChild.getName());
System.out.println(" "+fristChild.attribute("name").getValue());
Iterator iterator = fristChild.elementIterator();
while (iterator.hasNext()){
Element element = (Element) iterator.next();
System.out.println("\t"+element.attributeValue("name"));
}
}
}
最后,欢迎各位大佬多多指点
有一起学习的可以加我微信:lxl1052681394