【196】JAVA8 用 DOM 方式的 API 解析XML文件,无需引入第三方依赖。

JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件,无需引入第三方依赖。下面是两个测试用的 XML 文件:

test.xml

<allData><pan attr1="a" attr2="b">1</pan><tilt>2</tilt><zoom>3</zoom><list><item>item0</item><item>item1</item><item>item2</item></list><user-list><user><name>张三</name><gender></gender></user><user><name>高启兰</name><gender></gender></user></user-list>
</allData>

test2.xml

<allData><pan attr1="a" >1</pan><zoom>3</zoom><list><item>item0</item><item>item1</item><item>item2</item></list>
</allData>

负责接收所有信息的 AllDataDTO.java

package zhangchao;
import java.util.ArrayList;
import java.util.List;public class AllDataDTO {private Integer pan;private Integer tilt;private Integer zoom;private List<String> list = new ArrayList<>();private String panAttr1;private String panAttr2;private List<AllDataUserDTO> userList = new ArrayList<>();/////  setters/getters///@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("AllDataDTO{");sb.append("pan=").append(pan);sb.append(", tilt=").append(tilt);sb.append(", zoom=").append(zoom);sb.append(", list=").append(list);sb.append(", panAttr1='").append(panAttr1).append('\'');sb.append(", panAttr2='").append(panAttr2).append('\'');sb.append(", userList=").append(userList);sb.append('}');return sb.toString();}public List<AllDataUserDTO> getUserList() {return userList;}public void setUserList(List<AllDataUserDTO> userList) {this.userList = userList;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public String getPanAttr1() {return panAttr1;}public void setPanAttr1(String panAttr1) {this.panAttr1 = panAttr1;}public String getPanAttr2() {return panAttr2;}public void setPanAttr2(String panAttr2) {this.panAttr2 = panAttr2;}public Integer getPan() {return pan;}public void setPan(Integer pan) {this.pan = pan;}public Integer getTilt() {return tilt;}public void setTilt(Integer tilt) {this.tilt = tilt;}public Integer getZoom() {return zoom;}public void setZoom(Integer zoom) {this.zoom = zoom;}
}

负责接收用户信息的 AllDataUserDTO.java

package zhangchao;public class AllDataUserDTO {private String name;private String gender;@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("AllDataUserDTO{");sb.append("name='").append(name).append('\'');sb.append(", gender='").append(gender).append('\'');sb.append('}');return sb.toString();}/////  setters/getters///public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}
}

处理 XML 文件的工具类,XmlUtils.java

package zhangchao;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;public class XmlUtils {public static AllDataDTO parseXml(String xmlFilePath) {File file = new File(xmlFilePath);if (!file.exists()) {return null;}DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilderFactory的对象DocumentBuilder builder;AllDataDTO allDataDTO = null;try {builder = factory.newDocumentBuilder();//创建一个DocumentBuilder对象Document doc = builder.parse("file:///" + xmlFilePath);Element root = doc.getDocumentElement();//获取根节点allDataDTO = new AllDataDTO();NodeList childNodes = root.getChildNodes();int length = childNodes.getLength();for (int i = 0; i < length; i++) {Node node = childNodes.item(i);String nodeName = node.getNodeName();if ("pan".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setPan(tmp);NamedNodeMap namedNodeMap = node.getAttributes();Node attr1 = namedNodeMap.getNamedItem("attr1");if (attr1 != null) {String attr1Cont = attr1.getTextContent();attr1Cont = (attr1Cont == null ? null : attr1Cont.trim());allDataDTO.setPanAttr1(attr1Cont);}Node attr2 = namedNodeMap.getNamedItem("attr2");if (attr2 != null) {String attr2Cont = attr2.getTextContent();attr2Cont = (attr2Cont == null ? null : attr2Cont.trim());allDataDTO.setPanAttr2(attr2Cont);}} else if ("tilt".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setTilt(tmp);} else if ("zoom".equals(nodeName)) {String content = node.getTextContent();content = (content == null ? null : content.trim());Integer tmp = null;try {tmp = Integer.parseInt(content);} catch (NumberFormatException e) {}allDataDTO.setZoom(tmp);} else if ("list".equals(nodeName)) {NodeList itemList = node.getChildNodes();int itemLength = itemList.getLength();for (int j = 0; j < itemLength; j++) {Node item = itemList.item(j);if ("item".equals(item.getNodeName())) {String content = item.getTextContent();content = (content == null ? "" : content.trim());allDataDTO.getList().add(content);}}} else if ("user-list".equals(nodeName)) {NodeList userList = node.getChildNodes();int userListLength = userList.getLength();for (int j = 0; j < userListLength; j++) {Node user = userList.item(j);// 读取用户的属性if ("user".equals(user.getNodeName())) {AllDataUserDTO userDTO = new AllDataUserDTO();NodeList params = user.getChildNodes();int paramsLength = params.getLength();for (int k = 0; k < paramsLength; k++) {Node param = params.item(k);String content = param.getTextContent();if (content != null) {content = content.trim();}String paramName = param.getNodeName();if ("name".equals(paramName)) {userDTO.setName(content);} else if ("gender".equals(paramName)) {userDTO.setGender(content);}}allDataDTO.getUserList().add(userDTO);}}}}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}return allDataDTO;}
}

用于测试效果的类 Main.java

package zhangchao;public class Main {public static void main(String[] args) {AllDataDTO allDataDTO = XmlUtils.parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +"test.xml");AllDataDTO allDataDTO2 = XmlUtils.parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +"test2.xml");System.out.println(allDataDTO);System.out.println(allDataDTO2);}
}

输出结果:

AllDataDTO{pan=1, tilt=2, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='b', userList=[AllDataUserDTO{name='张三', gender='男'}, AllDataUserDTO{name='高启兰', gender='女'}]}
AllDataDTO{pan=1, tilt=null, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='null', userList=[]}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文总结】基于深度学习的特征点提取,特征点检测的方法总结

这里写目录标题 相关工作1. Discriminative Learning of Deep Convolutional Feature Point Descriptors(2015)网络结构sift算法损失函数的构建 2.MatchNet(2015)网络中的组成部分其他组成部分损失函数结果 3.LIFT: Learned Invariant Feature Transform(2016)网络结构训练网络…

【Spring Boot 3】【Redis】基本数据类型操作

【Spring Boot 3】【Redis】基本数据类型操作 背景介绍开发环境开发步骤及源码工程目录结构背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

虚拟线程探索与实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

【LeetCode每日一题】2171. 拿出最少数目的魔法豆

2024-1-18 文章目录 [2171. 拿出最少数目的魔法豆](https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/)思路&#xff1a; 2171. 拿出最少数目的魔法豆 思路&#xff1a; 对输入的数组进行排序&#xff0c;使得数组中的元素按照升序排列。初始化一个变量s…

SQL注入实战操作

一&#xff1a;SQl注入分类 按照注入的网页功能类型分类&#xff1a; 1、登入注入&#xff1a;表单&#xff0c;如登入表单&#xff0c;注册表单 2、cms注入&#xff1a;CMS逻辑:index.php首页展示内容&#xff0c;具有文章列表(链接具有文章id)、articles.php文 章详细页&a…

阿里云腾讯七牛内容安全配置

一&#xff0c;阿里云 1&#xff0c;配置RAM角色权限 向RAM用户授权系统策略权限&#xff1a;AliyunYundunGreenWebFullAccess 2&#xff0c;内容安全控制台——授权访问OSS 不授权——会报错——no permission(not authorized about role AliyunCIPScanOSSRole)

Linux 【C编程】 引入线程,线程相关函数

1.线程的引入 1.1使用线程同时读取键盘和鼠标 代码演示&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <string.h> // 读取…

前端面试题(持续更新~~)

文章目录 一、基础1、数组常用的方法2、数组有哪几种循环方式&#xff1f;分别有什么作用&#xff1f;3、字符串常用的方法4、原型链5、闭包6、常见的继承7、cookie 、localstorage 、 sessionstrorage区别8、数组去重方法9、http 的请求方式10、数据类型的判断方法11、cookie …

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色&#xff0c;它不仅仅是一项技术手段&#xff0c;更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性&#xff0c;并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

使用zabbix-proxy进行分布式监控

目录 一、准备4台服务器 二、配置主从复制 1.准备环境 2.主机名解析 3.安装数据库 4.配置主库db1 5.配置从库db2 6.主从状态显示 三、db1&#xff0c;db2配置zabbix-agent 三、zabbix-server的配置 四、zabbix-proxy的配置 1.为您的平台安装和配置Zabbix-proxy a. …

操作教程|JumpServer堡垒机结合Ansible进行批量系统初始化

运维人员常常需要对资产进行系统初始化的操作&#xff0c;而初始化服务器又是一项繁琐的工作&#xff0c;需要花费运维人员大量的时间和精力。为了提高效率&#xff0c;许多组织会使用自动化工具和脚本来简化这些任务。自动化工具的运用可以大幅降低运维人员的工作量&#xff0…

Redis实战之-分布式锁

一、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行…

档案数字化如何选择合适的扫描仪

选择合适的扫描仪是进行档案数字化的关键步骤。以下是一些选择合适扫描仪的要点&#xff1a; 1. 扫描速度&#xff1a;选择具有合适的扫描速度的扫描仪&#xff0c;以便能够快速处理大量的文件。 2. 扫描分辨率&#xff1a;扫描分辨率决定了扫描后图像的清晰度。对于大多数文档…

RIP基础实验配置

要使用RIP完成以上命令需求 1&#xff0c;首先划分ip地址 有图可见有四个网段需要划分 192.168.1.0/26 192.168.3.0/26 192.168.7.0/26 192.168.5.0/26 给两个骨干网段&#xff0c;给两个环回接口&#xff0c;由下图所示&#xff1a; 其次&#xff0c;规划好ip后在各个接口…

v-if和v-for哪个优先级更高?

v-if和v-for哪个优先级更高&#xff1f; 结论&#xff1a; vue2输出的渲染函数是先执行循环&#xff0c;在看条件判断&#xff0c;如果将v-if和v-for写在一个标签内&#xff0c;哪怕只渲染列表中的一小部分&#xff0c;也要重新遍历整个列表&#xff0c;无形造成资源浪费。vu…

【JavaScript】事件监听:多媒体事件

目录 一、play&#xff1a;当媒体开始播放时触发。 二、pause&#xff1a;当媒体暂停播放时触发。 三、ended&#xff1a;当媒体播放结束时触发。 四、timeupdate&#xff1a;当媒体的播放时间发生变化时触发&#xff0c;通常与进度条等播放控件 五、canplay&#xff1a;当…

汽车售后服务客户满意度调查报告

本文由群狼调研&#xff08;长沙旅行社满意度调查&#xff09;出品&#xff0c;欢迎转载&#xff0c;请注明出处。汽车售后服务客户满意度调查报告通常包括以下内容&#xff1a; 1.调研概况&#xff1a;介绍调研的目的、背景和范围&#xff0c;包括调研的时间、地点和样本规模等…

DolphinDB 与盈米基金达成战略合作,打造领先的资管机构投顾解决方案

1月16日上午&#xff0c;DolphinDB 与盈米基金在上海签署战略合作协议&#xff0c;共同开启专业资管投顾投研合作新篇章。 DolphinDB 联合创始人、COO 初阳春与盈米基金副总裁、研究院院长杨媛春出席仪式&#xff0c;并代表双方完成签约。 打造市场领先的资管机构投顾服务 盈…

浅析Redis①:命令处理核心源码分析(上)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库&#xff0c;其重要性不言而喻&#xff0c;作为普调开发者&#xff0c;我们在日常开发中使用Redis&#xff0c;主要聚焦于Redis的基层数据结构的命令使用&#xff0c;很少会有人对Redis的内部实现机制进行了解&#xff0c…

vscode设置terminal的最大行数

今天跑代码出现一个问题&#xff0c;就是整个程序跑完&#xff0c;整个程序的输出信息过多&#xff0c;最开始输出的信息已经被vscode的缓存冲掉了&#xff0c;只能看到最后的一部分&#xff0c;具体的原因是vscode的terminal默认只能保存1000行的信息&#xff0c;所以如果想保…