**什么是dom4j **
dom4j是一个用于处理XML文档的Java开源库。它提供了简单而灵活的API,用于解析、查询、创建和修改XML文档。dom4j具有良好的性能和易用性,广泛用于Java开发中处理XML数据。您可以使用dom4j来读取XML文件、提取节点、修改节点内容以及生成新的XML文档等操作。
处理XML文件的常用Java技术包括
- DOM (Document Object Model):DOM是一种基于树结构的API,它将整个XML文档加载到内存中,并允许您通过操作树节点来访问和修改XML数据。
- SAX (Simple API for XML):SAX是一种基于事件驱动的API,它逐行解析XML文档,当解析器遇到特定事件(如开始标签、结束标签、文本等)时,会触发相应的回调方法。
- StAX (Streaming API for XML):StAX是一种混合了DOM和SAX的API,它允许您以流式方式读取和写入XML文档,可以在解析过程中选择性地处理特定的节点。
- JAXB (Java Architecture for XML Binding):JAXB是Java的一种标准API,它提供了将XML和Java对象相互转换的功能。通过定义XML Schema或使用注解,您可以将XML文档映射到Java对象,并进行读取、修改和生成XML数据。
代码演示
导入相关依赖
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
演示如何写出一个xml文件
package cn.zhouxiaoyue.com.dom4j;
/**
* ClassName: Dom4jExamplePackage: cn.zhouxiaoyue.com.dom4j
* Description:简单演示写入
*
* @author ZhouXiaoYue
* CreateTime 2023/7/10 9:57
* @version 1.0
*/
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Dom4jExample {
public static void main(String[] args) {
// 创建一个新的XML文档
Document document = DocumentHelper.createDocument();
// 创建根元素
Element rootElement = document.addElement("root");
// 创建子元素
Element childElement1 = rootElement.addElement("child1");
childElement1.setText("This is child element 1");
Element childElement2 = rootElement.addElement("child2");
childElement2.setText("This is child element 2");
// 将XML文档写入文件
try {
//文件写入到resources目录下
String filePath = "src/main/resources/example.xml";
XMLWriter writer = new XMLWriter(new FileWriter(filePath));
writer.write(document);
writer.close();
System.out.println("XML文件创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
演示读入
演示文件
<?xml version="1.0" encoding="UTF-8"?>
<reqt>
<svcHdr>
<corrId></corrId>
<svcId>$trxCode</svcId>
<verNbr>$verNbr</verNbr>
<csmrId>$csmrId</csmrId>
<csmrSerNbr>$csmrSerNbr</csmrSerNbr>
<tmStamp>$tmStamp</tmStamp>
<reqtIp>10.1.80.185</reqtIp>
</svcHdr>
<appHdr>
<src>QDEB</src>
<dest>ECDS</dest>
<userName></userName>
<sdDtTm>$sendHostTime</sdDtTm>
<transId>042</transId>
<transIdRef></transIdRef>
<sdBnk>$zprOpenBank</sdBnk>
<sdAcount>$zprNo</sdAcount>
<sdType>$zprType</sdType>
<recvBnk>$kprOpenBank</recvBnk>
<recvAcount>$kprNo</recvAcount>
<recvType>$kpKind</recvType>
<param1></param1>
<param2></param2>
<param3></param3>
<proxy>0</proxy>
</appHdr>
<appBody>
<comrclDrft>
<idNb>$billNo</idNb>
<isseAmt>$billAmt</isseAmt>
</comrclDrft>
<showr>
<role>$zprType</role>
<roleNm></roleNm>
<nm>$zprName</nm>
<cmonId>$zprOrgCode</cmonId>
<elctrncSgntr></elctrncSgntr>
<acct>
<id>$zprNo</id>
<acctSvcr>$zprOpenBank</acctSvcr>
</acct>
<agcy>
<acct>
<acctSvcr></acctSvcr>
</acct>
</agcy>
</showr>
<showee>
<nm>$kprName</nm>
<acct>
<id>$kprNo</id>
<acctSvcr>$kprOpenBank</acctSvcr>
</acct>
</showee>
</appBody>
</reqt>
文件大体结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFnllHYO-1688957520110)(./images/1688955291267.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDHRaq7b-1688957520111)(./images/1688955309880.png)]
代码演示
package cn.zhouxiaoyue.com.dom4j;
import org.dom4j.DocumentException;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* ClassName: Dom4jReadPackage: cn.zhouxiaoyue.com.dom4j
* Description:演示读入xml
*
* @author ZhouXiaoYue
* CreateTime 2023/7/10 10:07
* @version 1.0
*/
public class Dom4jRead {
public static void main(String[] args) {
try {
// 创建一个SAXReader对象
SAXReader reader = new SAXReader();
// 读取XML文件
Document document = reader.read("src/main/resources/readtest.xml");
// 获取根元素
Element rootElement = document.getRootElement();
// 解析svcHdr元素
Element svcHdrElement = rootElement.element("svcHdr");
String svcId = svcHdrElement.elementText("svcId");
String verNbr = svcHdrElement.elementText("verNbr");
String csmrId = svcHdrElement.elementText("csmrId");
// 其他解析逻辑...
// 解析appHdr元素
Element appHdrElement = rootElement.element("appHdr");
String src = appHdrElement.elementText("src");
String dest = appHdrElement.elementText("dest");
String userName = appHdrElement.elementText("userName");
// 其他解析逻辑...
// 解析appBody元素
Element appBodyElement = rootElement.element("appBody");
Element comrclDrftElement = appBodyElement.element("comrclDrft");
String idNb = comrclDrftElement.elementText("idNb");
String isseAmt = comrclDrftElement.elementText("isseAmt");
// 其他解析逻辑...
// 解析showr元素
Element showrElement = appBodyElement.element("showr");
String role = showrElement.elementText("role");
String roleNm = showrElement.elementText("roleNm");
String nm = showrElement.elementText("nm");
// 其他解析逻辑...
// 解析showee元素
Element showeeElement = appBodyElement.element("showee");
String showeeNm = showeeElement.elementText("nm");
// 其他解析逻辑...
// 打印解析结果
System.out.println("svcId: " + svcId);
System.out.println("verNbr: " + verNbr);
System.out.println("csmrId: " + csmrId);
System.out.println("src: " + src);
System.out.println("dest: " + dest);
System.out.println("userName: " + userName);
System.out.println("idNb: " + idNb);
System.out.println("isseAmt: " + isseAmt);
System.out.println("role: " + role);
System.out.println("roleNm: " + roleNm);
System.out.println("nm: " + nm);
System.out.println("showeeNm: " + showeeNm);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
演示列表的循环遍历
演示文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="888881">
<name>tom</name>
<surname>tom</surname>
<age>28</age>
</student>
<student id="888882">
<name>tom</name>
<surname>tom</surname>
<age>28</age>
</student>
<student id="888883">
<name>tom</name>
<surname>tom</surname>
<age>28</age>
</student>
<student id="888881">
<name>tom</name>
<surname>tom</surname>
<age>28</age>
</student>
</students>
代码
package cn.zhouxiaoyue.com.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
import java.util.List;
/**
* ClassName: ReadStudentPackage: cn.zhouxiaoyue.com.dom4j
* Description:
*
* @author ZhouXiaoYue
* CreateTime 2023/7/10 10:41
* @version 1.0
*/
public class ReadStudentXml {
public static void main(String[] args) {
try {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 读取XML文件
Document document = reader.read(new File("src/main/resources/student.xml"));
// 获取根元素
Element rootElement = document.getRootElement();
// 遍历student元素
Iterator<Element> studentIterator = rootElement.elementIterator("student");
while (studentIterator.hasNext()) {
Element studentElement = studentIterator.next();
// 获取student元素的id属性
String id = studentElement.attributeValue("id");
System.out.println("Student ID: " + id);
// 获取name、surname和age元素的值
String name = studentElement.elementText("name");
String surname = studentElement.elementText("surname");
String age = studentElement.elementText("age");
System.out.println("Name: " + name);
System.out.println("Surname: " + surname);
System.out.println("Age: " + age);
System.out.println("-----------------------");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
dom4j是一个流行的Java XML解析库,它有以下优点和缺点:
优点:
- 简单易用:dom4j提供了简单的API,使XML解析变得容易和直观。
- 高性能:dom4j使用了一些优化技术,如缓存和延迟加载,以提高解析性能。
- 强大的XPath支持:dom4j支持XPath查询,可以方便地从XML文档中提取数据。
- 完整的功能集:dom4j提供了许多有用的功能,如XML文档的创建、修改和序列化。
- 良好的扩展性:dom4j支持自定义的XML解析器和XMLWriter,可以根据需要进行扩展。
缺点: - 内存占用:dom4j在解析XML时需要将整个文档加载到内存中,对于大型XML文件可能会占用较多的内存。
- 复杂的配置:在某些情况下,dom4j的配置可能会稍微复杂,特别是在处理命名空间和DTD验证时。
总体而言,dom4j是一个功能强大且灵活的XML解析库,适用于大多数Java项目。但在选择使用时,
需要考虑到项目的具体需求和性能要求。