1. 依赖
1.1.基于dom4j生成与解析XML
1.2.jar包坐标
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
2.详细代码附带详细的注释
package com.zyp.test.xml;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
/**
* @author syl
* @description 基于dom4j解析和生成xml文件
* @since 2021/11/27
*/
@Slf4j
public class Dom4jXmlTest {
/**
* 生成xml
*/
@Test
public void createXml(){
Document document = DocumentHelper.createDocument();
//生成根节点 root为标签名,name,id 为标签属性
Element root = document.addElement("root")
.addAttribute("name", "根节点")
.addAttribute("id", "0");
//设置标签值
root.setText("根节点");
//设置注释
root.addComment("根节点");
//生成一级节点1
Element root1 = root.addElement("root1")
.addAttribute("name", "一级节点1")
.addAttribute("id", "01");
root1.setText("一级节点1");
//生成一级节点2
Element root2 = root.addElement("root2")
.addAttribute("name", "一级节点2")
.addAttribute("id", "02");
root2.setText("一级节点2");
//生成一级节点3
Element root3 = root.addElement("root3")
.addAttribute("name", "一级节点3")
.addAttribute("id", "03");
//生成二级节点31
Element root31 = root3.addElement("root31")
.addAttribute("name", "二级节点31")
.addAttribute("id", "031");
//生成二级节点32
Element root32 = root3.addElement("root32")
.addAttribute("name", "二级节点32")
.addAttribute("id", "032");
//设置xml文件格式
OutputFormat format = OutputFormat.createPrettyPrint();
//指定xml的编码,防止乱码,默认是"UTF-8"
format.setEncoding("UTF-8");
// 行缩进
format.setIndentSize(2);
// 一个结点为一行
format.setNewlines(true);
// 去重空格
format.setTrimText(true);
// 放置xml文件中第二行为空白,默认true
format.setNewLineAfterDeclaration(false);
//是否使用XHTML标准,默认不采用
format.setXHTML(true);
//是否用空格填充字符串元素边界,默认否
format.setPadText(true);
//指定生成到指定文件,内容直接覆盖
File file=new File("H:\\test.xml");
XMLWriter writer= null;
try {
writer = new XMLWriter(new FileOutputStream(file),format);
//设置是否转义,默认转义
writer.setEscapeText(false);
writer.write(document);
writer.close();
log.info("生成xml成功!");
} catch (Exception e) {
e.printStackTrace();
log.error("生成xml失败!");
}
}
/**
* Element 标签
* Attribute 标签属性
* 解析xml
*/
@Test
public void parseXml(){
SAXReader reader=new SAXReader();
Document document = null;
try {
document = reader.read(new File("H:\\test.xml"));
} catch (DocumentException e) {
e.printStackTrace();
log.error("解析xml文件失败");
}
//获取根节点
Element root = document.getRootElement();
//接收标签列表
Iterator<Element> elements;
//接收标签
Element element;
//接收标签属性列表
Iterator<Attribute> attribute;
log.info("一级标签值为:"+root.getTextTrim()+"\n一级标签名为:"+root.getName());
//获取一级标签所有的属性
Iterator<Attribute> attributes = root.attributeIterator();
while (attributes.hasNext()){
log.info("一级标签属性名:{},属性值:{}",attributes.next().getName(),attributes.next().getValue());
}
//获取一级标签下面的所有的二级标签
elements= root.elementIterator();
while (elements.hasNext()){
element = elements.next();
log.info("二级标签值为:"+ element.getTextTrim()+"\n二级标签名为:"+ element.getName());
attribute = element.attributeIterator();
while (attribute.hasNext()){
log.info("二级标签属性名:{},属性值:{}", attribute.next().getName(), attribute.next().getValue());
}
}
//获取指定标签下面所有的标签
elements = root.element("root3").elementIterator();
while (elements.hasNext()){
element= elements.next();
log.info("三级标签名:{},三级标签值:{}",element.getTextTrim(), element.getName());
attribute = element.attributeIterator();
while (attribute.hasNext()){
log.info("三级标签属性名:{},属性值:{}", attribute.next().getName(), attribute.next().getValue());
}
}
log.info("解析xml文件成功");
}
}