使用方式:在pom.xml中导入dom4j对应的jar
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
优点:dom4j使Java生成和解析XML灵活性变高,并且代码易于维护
API操作类:
Document:表示xml文档信息,是一个树形结构
Eelment:表示xml的元素结点,提供一些操作其子元素方法的,如文本、属性、名称空间等
Attribute:表示元素结点中的属性
上代码:
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
public class Dom4jTest {
public static void main(String[] args) throws Exception {
Document res = creatXML();
System.out.println(res.asXML());
System.out.println("=========================================");
Document document = ParsingXML();
System.out.println(document.asXML());
System.out.println("=========================================");
// 递归打印xml文档信息
StringBuffer buffer = new StringBuffer();
parseElement(document.getRootElement(), buffer);
System.out.println(buffer.toString());
}
//生成XML
public static Document creatXML() throws Exception {
//第一步:创建一个Document实例
Document document= DocumentHelper.createDocument();//创建xml文档
//第二步:先添加一个根结点,然后再添加子结点,构造成一个树形结构
Element root=document.addElement("WLLINKED");//创建根元素
//第三步:添加xml文件样式(也可自定义样式),并输出xml文件到指定的路径下
// 在根节点下添加第一个子节点
Element oneChildElement= root.addElement("HEAD").addAttribute("pro", "head name");
oneChildElement.addElement("TYPE").addText("TMS_WH_NODE_RECORD_SERVICE_ASYNC");
oneChildElement.addElement("SENDER").addText("56linked");
oneChildElement.addElement("CODE").addText("LJYS");
oneChildElement.addElement("DATE").addText("20190611215406146600191");
oneChildElement.addElement("INVOKE_UNIKEY");
// 在根节点下添加第二个子节点
Element twoChildElement= root.addElement("XML_DATA").addAttribute("pro", "DATA");
twoChildElement.addElement("WAREHOUSE_CODE").addText("仓库编码");
twoChildElement.addElement("WAREHOUSE_NAME").addText("仓库名称");
twoChildElement.addElement("STOWAGE_NO").addText("调度单号");
twoChildElement.addElement("LEGNO").addText("客户单号");
twoChildElement.addElement("WH_NODE_NAME").addText("仓库节点名称");
twoChildElement.addElement("OPERATOR_NAME").addText("操作人员名称");
twoChildElement.addElement("KPI_TIME").addText("2022-09-09 12:33:00");
OutputFormat format = new OutputFormat();
format.setIndentSize(2); // 行缩进
format.setNewlines(true); // 一个结点为一行
format.setTrimText(true); // 去重空格
format.setPadText(true);
format.setNewLineAfterDeclaration(false); // 放置xml文件中第二行为空白行
//System.out.println(document.asXML());
// 输出xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("E:\\dom4j.xml")), format);
writer.write(document);
System.out.println("dom4j CreateDom4j success!");
return document;
}
//Parsing XML
//解析XML
//读取XML
//SAXReader可以通过多种方式读取xml数据,并返回Document格式的对象。
//通过查看源码,可以看出read()方法接收File,InputStream和URL等格式的参数来读取相应的xml数据。
public static Document ParsingXML() {
Document document = null;
try {
//创建解析器 第一步:创建一个SAXReader解析器
SAXReader reader=new SAXReader();//创建读取文件内容对象
//第二步:解析xml文件,重新构建成一个Document对象,转换成Document结点
document=reader.read(new File("E:\\dom4j.xml"));//指定文件并读取
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
public static void parseElement(Element element, StringBuffer buffer) {
buffer.append("<"+element.getName());
List<Attribute> attrs = element.attributes();
if (attrs != null) {
for (Attribute attr : attrs) {
buffer.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");
}
}
buffer.append(">");
Iterator<Node> iterator = element.nodeIterator();
while (iterator.hasNext()) {
Node node = iterator.next();
if (node instanceof Element) {
Element eleNode = (Element) node;
parseElement(eleNode, buffer);
}
if (node instanceof Text) {
Text text = (Text) node;
buffer.append(text.getText());
}
if (node instanceof CDATA) {
CDATA dataNode = (CDATA) node;
buffer.append(dataNode.getText());
}
if (node instanceof Comment) {
Comment comNode = (Comment) node;
buffer.append(comNode.getText());
}
}
buffer.append("</"+element.getName()+">");
}
}