Java dom4j解析XML文件

article/2025/6/27 19:32:02

一、dom4j

        dom4j 是一个基于 Java 的开源 XML 解析和操作库。它可以方便地对 XML 文档进行读取、创建、修改和写入操作。dom4j 支持 XPath、XSLT 等标准,具有性能高、功能强大、易于使用等特点,常用于 Java 项目中对 XML 数据的处理。

二、dom4j优点

  1. 高性能:Dom4j被设计为高性能的XML处理库,适用于处理大型XML文档。在处理大型XML文件时,Dom4j显示出较好的性能,尤其是读取速度较快。这得益于其高效的内部数据结构和算法,使得XML文档的解析和操作更加迅速。

  2. 简单易用:Dom4j提供了简单而强大的API,使得解析、生成和操作XML文档变得容易。它允许开发者以多种方式解析和操作XML文档,如DOM风格、SAX风格以及JAXP兼容的方式。此外,Dom4j还支持XPath查询,可以通过XPath表达式来定位和选择XML文档中的元素,进一步简化了XML文档的处理过程。

  3. 灵活性:Dom4j提供了丰富的API和接口,使得开发者可以轻松实现自定义功能。它支持XML命名空间,允许处理具有命名空间的XML文档。同时,Dom4j还支持扩展和自定义,开发者可以通过继承现有类来实现特定需求。

  4. 开源社区支持:作为一个成熟的库,Dom4j拥有活跃的用户社区和开发者社区。社区成员积极贡献代码、分享经验和解决问题,为Dom4j的持续发展提供了有力支持。此外,Dom4j的文档和示例也相对丰富,有助于开发者更快地学习和掌握其使用方法。

  5. 良好的兼容性:Dom4j与流行的XML解析库如JAXP/SAX等兼容性良好,这使得开发者可以在现有的Java项目中轻松集成Dom4j,而无需担心兼容性问题。

三、dom4j官网

  dom4j 下载dom4j-2.1.4版本

四、 dom4j常用 API 

1、节点操作

操作类型API 示例
获取根节点Element root = document.getRootElement(); 
添加子节点Element child = parent.addElement("childTag"); 
遍历子节点List<Element> children = element.elements(); 
删除节点parent.remove(childElement); 

2、属性操作

操作类型API 示例
添加属性element.addAttribute("key", "value"); 
获取属性值String value = element.attributeValue("key"); 
属性迭代器Iterator<Attribute> iter = element.attributeIterator();

 3、内容操作

操作类型API 示例
获取文本内容String text = element.getText(); 
设置文本内容element.setText("new content"); 
XML 转字符串String xmlStr = document.asXML(); 

五、dom4j解析XML

1、学生类Student 和测试类TestXML  (省...)

2、业务逻辑类StudentBiz

package net.xml;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class StudentBiz {//文件路径private String filePath = "student.xml";/*** 1.获取文档对象** @return* @throws Exception*/private Document getDocument() throws Exception {//创建SAXReader对象SAXReader saxReader = new SAXReader();//创建Document对象return saxReader.read(filePath);}/*** 2.显示所有学生信息*/public List<Student> show() {try {//创建集合对象List<Student> stus = new ArrayList<>();//获取文档对象Document document = getDocument();//获取根节点Element rootElement = document.getRootElement();
//            System.out.println("根节点名称:" + rootElement.getName());//获取所有子节点集合List<Element> elements = rootElement.elements();//判断if (elements.size() == 0) {System.out.println("没有学生信息!");} else {//遍历集合for (Element element : elements) {//获取属性值String id = element.attributeValue("id");//获取属性值String name = element.elementText("name");int age = Integer.parseInt(element.elementText("age"));//封装对象Student student = new Student(id, name, age);//添加到集合中stus.add(student);}return stus;}} catch (Exception e) {e.printStackTrace();}return null;}/*** 5.排序年龄从大到小*/public void sort(){List<Student> stus = show();Collections.sort(stus, Comparator.comparing(Student::getAge).reversed());stus.forEach(System.out::println);}/*** 3.保存数据到XML文件中** @param document*/public void saveToXml(Document document) {//创建字符输出流对象try (FileWriter fw = new FileWriter(filePath);) {//格式化OutputFormat of = OutputFormat.createPrettyPrint();//创建XMLWriter对象XMLWriter xmlWriter = new XMLWriter(fw, of);//写入文档对象xmlWriter.write(document);//关闭流xmlWriter.close();} catch (Exception e) {e.printStackTrace();}}/*** 6.判断id是否存在* @param root* @param id* @return*/public boolean findById(Element root,String id){//定义标记位boolean flag = false;try {//获取所有子节点集合List<Element> elements = root.elements();for (Element element : elements) {if (id.equals(element.attributeValue("id"))) {flag= true;break;}}} catch (Exception e) {e.printStackTrace();}return flag;}/*** 4.添加学生信息** @param student <student id="10001">*                <name>张三</name>*                <age>18</age>*                </student>*/public void add(Student student) {try {//获取文档对象Document document = getDocument();//获取根节点对象Element rootElement = document.getRootElement();//判断id是否存在if (findById(rootElement,student.getId())) {System.out.println(student.getId()+"已存在!");return;}else { //不存在,添加学生信息//创建子节点对象student//<student></student>Element element = rootElement.addElement("student");//添加属性值 id
//             <student id="10001">element.addAttribute("id", student.getId());//添加元素内容  name age//<name>张三</name>element.addElement("name").addText(student.getName());//<age>18</age>element.addElement("age").addText(String.valueOf(student.getAge()));//保存数据到XML文件中saveToXml(document);System.out.println("添加成功!");}} catch (Exception e) {e.printStackTrace();}}/*** 5.删除学生信息** @param id*/public void delete(String id) {try {//定义标记位boolean flag = false;//获取文档对象Document document = getDocument();//获取根节点对象Element rootElement = document.getRootElement();//获取所有子节点集合List<Element> elements = rootElement.elements();for (Element element : elements) {//获取属性值,进行匹配idif (id.equals(element.attributeValue("id"))) {//删除节点对象rootElement.remove(element);//设置标记位flag = true;break;}}//判断标记位if (flag) {System.out.println("删除成功!");//保存数据到XML文件中saveToXml(document);} else {System.out.println("没有这个学生!"+id);}} catch (Exception e) {e.printStackTrace();}}public void update(Student student) {//定义标记位boolean flag = false;try {//获取文档对象Document document = getDocument();//获取根节点对象Element rootElement = document.getRootElement();//获取所有子节点集合List<Element> elements = rootElement.elements();for (Element element : elements) {//获取属性值,进行匹配idif (student.getId().equals(element.attributeValue("id"))) {//更新文本内容element.element("name").setText(student.getName());element.element("age").setText(String.valueOf(student.getAge()));flag = true;  //设置标记位break;}}//判断标记位if (flag) {System.out.println("更新成功!");//保存数据到XML文件中saveToXml(document);} else {System.out.println("没有这个学生!"+student.getId());}} catch (Exception e) {e.printStackTrace();}}}

六、dom4j对比其他技术

解析库内存消耗易用性功能扩展性
W3C DOM较差基础
SAX复杂有限
JDOM中等中等
DOM4J可控


http://www.hkcw.cn/article/VgYjiXwdHc.shtml

相关文章

从头认识AI-----循环神经网络(RNN)

前言 前面我们讲了传统的神经网络&#xff0c;如MLP、CNN&#xff0c;这些网络中的输入都被单独处理&#xff0c;没有上下文之间的信息传递机制&#xff0c;这在处理序列数据&#xff08;如语音、文本、时间序列&#xff09;时很鸡肋&#xff1a; 如何理解一句话中“前后文”的…

大陆武统台湾,韩国是否出手?李在明回答就很迷

【文/观察者网 刘程辉】韩国新一届总统选举前夕,韩国共同民主党总统候选人李在明接受美国《时代》杂志专访,期间谈及涉华问题。当被问到如果台湾遭大陆武统,韩国是否会对台湾伸出援手时,李在明给出了谜一般的回应——“等外星人入侵地球时,我才会考虑这个问题的答案”。值…

国羽女单包揽新加坡赛冠亚军 王祉怡陈雨菲会师决赛

5月31日,2025新加坡羽毛球公开赛半决赛中,王祉怡以2-1战胜日本选手山口茜,三局比分分别为21-12、12-21和21-17。这场胜利使得王祉怡与陈雨菲在决赛中会师,中国女单提前锁定了本次比赛的冠亚军。在此之前进行的另一场女单半决赛里,陈雨菲同样以2-1的成绩击败了队友韩悦,成…

法国多地户外禁烟违者罚款 儿童区域全面禁烟

法国即将实施一项严格的户外禁烟令,卫生与家庭部长卡特琳沃特兰宣布,所有儿童可能出入的户外场所将禁止吸烟。这项禁令将于7月1日生效,涵盖海滩、公园、花园、学校外、公交车站和体育场馆等区域。咖啡馆和酒吧的户外露台不受此禁令限制。违反规定者将面临135欧元(约合人民币…

江苏一医院推出“药膳粽” 特色养生受追捧

淮安一家医院近期推出五款特色药膳粽,包括纤体美容粽、宁心安神粽、健脾养胃粽、辛润养肺粽和益气固肾粽。这些粽子一经预告便被抢购一空,食堂不得不临时增加人手,在短短六天内售出7000多个。端午节自古以来就蕴含着丰富的健康文化内涵,挂艾草、菖蒲以驱邪避瘟,饮雄黄酒以…

特朗普:马斯克将继续往返白宫 政府效率部争议不断

5月31日,埃隆马斯克在白宫椭圆形办公室的新闻发布会上结束了他在特朗普政府的任期。会上,他与美国总统特朗普一起为政府效率部的工作站台,并承诺即使他离开,该部门的工作也不会停滞。特朗普表示马斯克“并非真的离开”,还会继续往返白宫,并称政府效率部是马斯克的心血结晶…

美计划扩大对中国公司技术制裁 从芯片到发动机的全方位封锁

近日,美国商务部工业和安全局再次升级对华技术出口管制,将矛头直指中国半导体和航空工业的关键领域。这些措施不仅限制了中国获取先进计算芯片和超级计算机技术,还首次将喷气发动机技术纳入禁运范围,标志着中美科技竞争进入全新阶段。10月7日颁布的新规是美国对华技术封锁的…

樊振东慕尼黑观看欧冠决赛 晒照与大耳朵杯合影

在欧冠决赛前夕,乒乓球奥运冠军樊振东通过社交媒体分享了一张照片,显示他已经抵达决赛举办地慕尼黑。照片中,樊振东与大耳朵杯合影,并配文:“早上好,慕尼黑。”巴黎圣日耳曼与国际米兰的欧冠决赛将于北京时间明天凌晨3:00在慕尼黑安联竞技场举行。责任编辑:zx0001

李晟演唱《枯叶蝶》 舞台封神时刻

家人们,李晟在浪姐上的《枯叶蝶》舞台简直封神!从初舞台凭《当》惊艳众人,到如今演唱《枯叶蝶》,她的每一次亮相都让人惊喜。她用实力证明,“枯叶蝶”也能在舞台上绽放耀眼光芒。责任编辑:zx0001

樊振东现身慕尼黑看欧冠 特邀嘉宾直击决赛

5月31日下午,乒乓球运动员樊振东发博晒出自己在慕尼黑的照片。据了解,樊振东将作为特邀嘉宾现身欧冠决赛现场,直击巴黎圣日耳曼vs国际米兰巅峰对决。责任编辑:zx0001

十个勤天他在叫他在笑 泥潭大战欢乐多

在最新一期的《五哈5》节目中,超大泥潭接力赛成为了欢乐的源泉,“十个勤天”在这片泥潭中仿佛找到了自己的主场,贡献了无数让人捧腹的笑点。赵小童在泥潭接力赛中遇到了麻烦,泥水没过了膝盖,她直接陷在泥潭里动弹不得。陈赫试图拉她一把,但赵小童却调侃道:“我起不来,你…

超深掩蔽联合改进YOLOv8实现温室番茄果实精准计数——93.8%精度突破与智慧农业应用

【导读】 番茄作为重要经济作物&#xff0c;其成熟度精准计数对优化采摘、品种改良等农艺管理至关重要。然而&#xff0c;传统视觉技术易受光照、果实重叠等因素干扰&#xff0c;而现有深度学习模型在复杂温室环境中跟踪稳定性不足&#xff0c;导致计数精度难以满足需求。沈阳…

STM32F103RCT6引脚图

系列文章目录 文章目录 系列文章目录前言 前言 STM32F103RCT6引脚图

校门口的“游烟”该管管了 校园成“重灾区”

“游烟”是指吸烟者在室外一边走路或骑车一边吸烟形成的烟雾,其实质就是二手烟。被动吸烟者往往猝不及防,尤其是在中小学校门口等场所,“游烟”问题尤为严重。近年来,多地已开始治理这一现象,但禁烟范围模糊、监管困难等问题仍待解决。例如,北京市民陈女士表示,尽管室内…

县政府收到信访后不作为引发舆情 25名官员被处理

5月30日,吉林省纪委监委公开通报了4起形式主义、官僚主义典型问题。其中一例是农安县政府办公室在督办解决群众信访诉求方面不作为慢作为的问题。2023年11月至2024年5月,农安县政府收到上级转办的关于群众反映合隆镇“桃花源著”回迁房二期项目建设存在质量、逾期回迁等问题后…

当地辟谣儿童节孩子淋雨演出 实为老师术后护眼打伞

5月30日,贵州毕节黔西市杜鹃街道办关工委举行六一儿童节文艺演出。期间,一位女士在台下打伞的视频在网络上传播,引发热议。有人质疑:“孩子在淋雨表演,老师却在打伞吗?”次日,黔西市政府相关部门回应称,经调查核实,“学生淋雨老师打伞”的说法并不属实。当天并未下雨,…

专家称不明飞行物是国外侦查卫星烧毁 夜空火光引多地关注

5月30日晚,山东潍坊、日照等地的网友在社交媒体上发布视频,称夜空中出现了不明飞行物。江苏、安徽等地的网友也报告了类似现象,有人猜测是火流星。一位天体物理学博主解释说,这是一颗国外发射的侦查卫星。5月31日早上,潍坊市昌邑县的王女士表示,她在30日晚8点45分左右看到…

吃饭越快肝脏更容易变胖吗 5分钟吃完饭的影响

快节奏的现代生活让人们常常为了赶时间而压缩吃饭时间,匆忙地吃完一顿饭。一项研究发现,经常在五分钟内吃完饭的人,肝脏更容易变胖。“吃饭太快”不再是简单的生活习惯问题,而是可能威胁肝脏健康的隐形推手。2024年8月,《营养与糖尿病》发表的一项研究表明,经常快速进食可…

美媒为劝特朗普放弃针对中国留学生,搬出了钱学森 历史教训不可忘

特朗普政府再次针对在美中国留学生,此举被批评为开启了“新学术冷战”。《纽约时报》专栏作者凯瑟琳金斯伯里首先想到了钱学森的故事。5月30日,她在文章中警告特朗普政府不要重蹈覆辙,因为疏远世界人才最终只会让美国得不偿失。钱学森23岁时来到美国,在加州与一群年轻科学家…

小伙亚硝酸盐中毒尿液呈蓝色 紧急救治挽回生命

前不久的一个深夜,浙江省立同德医院ICU收治了一名25岁的年轻小伙。他全身青紫,口唇发紫,送到医院时已陷入深昏迷状态。在之后的治疗过程中,他的尿液甚至变成了蓝色。医生检查后发现,小伙的血氧饱和度仅有64%,血压只有70/40mmHg,高铁血红蛋白浓度高达75%。心脏和大脑已处…