java xml 文本解析
示例文本
<Message><MessageName>time_request</MessageName><Timestamp>20220217165432906359</Timestamp><Body><EQPID>CMMAB01-DTP01</EQPID></Body>
</Message>
示例代码
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
String textContent = null;try {// 创建文档构建器并解析 XML 字符串DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));doc.getDocumentElement().normalize();// 获取 MessageName 元素NodeList messageNameList = doc.getElementsByTagName("MessageName");if (messageNameList.getLength() > 0) {textContent = messageNameList.item(0).getTextContent();} else {throw new ApiException(ApiException.showStr("Missing MessageName element."));}// 获取 Body 元素NodeList bodyList = doc.getElementsByTagName("Body");// 根据 MessageName 处理请求return equSMTService.saveICT(textContent, bodyList);} catch (Exception e) {// 记录异常并抛出 ApiExceptionthrow new ApiException(ApiException.showStr("Error processing the request: " + e.getMessage()));}
String eqpId = body.getElementsByTagName("EQPID").item(0).getTextContent();String machineId = body.getElementsByTagName("MACHINEID").item(0).getTextContent();String panelid = body.getElementsByTagName("PANELID").item(0).getTextContent();NodeList recipeid = body.getElementsByTagName("ITEM");for (int i = 0; i < recipeid.getLength(); i++) {Node badeNode = recipeid.item(i);if (badeNode.getNodeType() == Node.ELEMENT_NODE) {Element badeElement = (Element) badeNode;String itemid = badeElement.getElementsByTagName("ITEMID").item(0).getTextContent();String itemvalue =badeElement.getElementsByTagName("ITEMVALUE").item(0).getTextContent();}}
XML 解析流程概述 在这段代码中,主要实现了从一个 XML 格式的对象(假设object存储了 XML 数据)中解析出特定元素的值,并根据解析结果进行后续处理的功能。整体流程包括以下几个关键步骤:
- 准备解析环境
- 首先,创建DocumentBuilderFactory实例,通过调用DocumentBuilderFactory.newInstance()方法来获取一个工厂对象,用于创建DocumentBuilder实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 创建 DocumentBuilder 使用前面获取的工厂对象创建DocumentBuilder实例,这是实际用于解析 XML 的构建器。
DocumentBuilder builder = factory.newDocumentBuilder();
- 解析 XML 数据 将存储 XML 数据的object转换为字节流,并使用创建好的DocumentBuilder进行解析,得到代表整个
XML 文档结构的Document对象。同时,对文档元素进行规范化处理(例如处理文本节点的空白等)。
Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
- 提取特定元素的值
提取 MessageName 元素的值:
通过getElementsByTagName方法在解析后的Document对象中查找所有名为MessageName的元素,返回一个NodeList集合。
然后判断该集合的长度,如果大于 0,则获取第一个MessageName元素的文本内容,并存储到textContent变量中;否则,抛出一个自定义的ApiException异常,表示缺少MessageName元素。
NodeList messageNameList = doc.getElementsByTagName("MessageName");
if (messageNameList.getLength() > 0) {textContent = messageNameList.item(0).getTextContent();
} else {throw new ApiException(ApiException.showStr("Missing MessageName element."));
}
- 提取 Body 元素的值(虽然代码中未完整展示对 Body 元素内容的详细处理,但获取了该元素的节点列表):
同样使用getElementsByTagName方法获取所有名为Body的元素,得到一个NodeList。
NodeList bodyList = doc.getElementsByTagName("Body");
- 提取 Body 元素下特定子元素的值(以示例中的循环处理为例):
先通过body.getElementsByTagName(“EQPID”)等类似方式获取特定子元素(如EQPID、MACHINEID、PANELID等)的第一个节点,并获取其文本内容,分别存储到对应的变量(eqpId、machineId、panelid等)中。
对于ITEM元素下的子元素ITEMID和ITEMVALUE,通过循环遍历body.getElementsByTagName(“ITEM”)得到的NodeList,判断节点类型为元素节点后,进行强制类型转换,再分别获取其文本内容存储到相应变量(itemid和itemvalue)中。
String eqpId = body.getElementsByTagName("EQPID").item(0).getTextContent();
String machineId = body.getElementsByTagName("MACHINEID").item(0).getTextContent();
String panelid = body.getElementsByTagName("PANELID").item(0).getTextContent();
NodeList recipeid = body.getElementsByTagName("ITEM");
for (int i = 0; i < recipeid.getLength(); i++) {Node badeNode = recipeid.item(i);if (badeNode.getNodeType() == Node.ELEMENT_NODE) {Element badeElement = (Element) badeNode;String itemid = badeElement.getElementsByTagName("ITEMID").item(0).getTextContent();String itemvalue = badeElement.getElementsByTagName("ITEMVALUE").item(0).getTextContent();}
}
通过以上步骤,实现了对给定 XML 数据的解析、特定元素值的提取以及基于解析结果的后续业务处理,并对可能出现的异常进行了相应的处理。
返回XML 文本信息
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
import org.w3c.dom.Element;public class XmlMessageCreator {public static String createXmlMessage() {try {// 创建DocumentBuilderFactory实例DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();// 创建一个空的Document对象Document doc = builder.newDocument();// 创建根元素<Message>Element messageElement = doc.createElement("Message");doc.appendChild(messageElement);// 创建<MessageName>元素并设置文本内容Element messageNameElement = doc.createElement("MessageName");messageNameElement.setTextContent("time_request");messageElement.appendChild(messageNameElement);// 创建<Timestamp>元素并设置文本内容Element timestampElement = doc.createElement("Timestamp");timestampElement.setTextContent("20220217165432906359");messageElement.appendChild(timestampElement);// 创建<Body>元素Element bodyElement = doc.createElement("Body");messageElement.appendChild(bodyElement);// 创建<EQPID>元素并设置文本内容Element eqpidElement = doc.createElement("EQPID");eqpidElement.setTextContent("CMMAB01-DTP01");bodyElement.appendChild(eqpidElement);// 将Document对象转换为XML字符串TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(doc);StreamResult result = new StreamResult(new java.io.StringWriter());transformer.transform(source, result);return result.getWriter().toString();} catch (Exception e) {e.printStackTrace();return null;}}public static void main(String[] args) {String xmlMessage = createXmlMessage();if (xmlMessage!= null) {System.out.println(xmlMessage);}}
}
相关文章:
java xml 文本解析
示例文本 <Message><MessageName>time_request</MessageName><Timestamp>20220217165432906359</Timestamp><Body><EQPID>CMMAB01-DTP01</EQPID></Body> </Message>示例代码 import org.w3c.dom.Document; impo…...
Docker占用空间太大磁盘空间不足清理妙招
docker占用空间太大了,磁盘空间不足,清理3妙招 清除所有已停止的容器(container)、未被任何容器所使用的卷(volume)、未被任何容器所关联的网络(network)、所有悬空镜像(…...

编程之路,从0开始:字符函数和字符串函数
Hello大家好!很高兴我们又见面了! 给生活添点passion,开始今天的编程之路! 目录 1、字符分类函数 2、字符转换函数 3、字符串函数 1、 strcpy 2、 strcat 3、 strcmp 4、strlen(s) 5、strstr(s1, s2) 6、 strtok(s1, s2…...

化工防爆巡检机器人:在挑战中成长,为化工安全保驾护航
随着全球能源需求的不断攀升,化工行业的安全性与高效性愈发受到关注。化工设施规模巨大,而且其中多数存在高风险因素,像是易燃易爆化学物质、高温环境、有毒有害物质以及高压设备等。仅2023年,国内危化品事故就多达652起ÿ…...

音频采样数据格式
音频信号在模拟到数字转换时,会涉及到多个关键参数,如采样率、位深度、通道数等。下面是常见的音频采样数据格式及其相关概念: 1. 采样率 (Sample Rate) 采样率指的是每秒钟对音频信号进行采样的次数,单位为赫兹 (Hz)。常见的值…...
【pytorch】常用强化学习算法实现(持续更新)
持续更新常用的强化学习算法,采用单python文件实现,简单易读 2024.11.09 更新:PPO(GAE); SAC2024.11.12 更新:OptionCritic(PPOC) "PPO" import copy import time import torch import numpy as np import torch.nn as …...

DAY59||并查集理论基础 |寻找存在的路径
并查集理论基础 并查集主要有两个功能: 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 代码模板 int n 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一…...
Mybatis执行自定义SQL并使用PageHelper进行分页
Mybatis执行自定义SQL并使用PageHelper进行分页 基于Mybatis,让程序可以执行动态传入的SQL,而不需要在xml或者Select语句中定义。 代码示例 pom.xml 依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId&g…...
OpenCV DNN
OpenCV DNN 和 PyTorch 都是常用的深度学习框架,但它们的定位、使用场景和功能有所不同。让我们来对比一下这两个工具: 1. 框架和功能 OpenCV DNN:OpenCV DNN 模块主要用于加载和运行已经训练好的深度学习模型,支持多种深度学习…...
什么时候需要复写hashcode()和compartTo方法
在Java编程中,复写(重写)hashCode()和compareTo()方法的需求通常与对象的比较逻辑和哈希集合的使用紧密相关。但请注意,您提到的compartTo可能是一个拼写错误,正确的方法名是compareTo()。以下是关于何时需要复写这两个…...
PostgreSQL 日志文件备份
随着信息安全的建设,在三级等保要求中,要求日志至少保留半年 180 天以上。那么 PostgreSQL 如何实现这一要求呢。 我们需要配置一个定时任务,定时的将数据库日志 log 下的文件按照生成的规则将超过一定时间的日志拷贝到其它的路径下…...

2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
2023年第十三届MathorCup高校数学建模挑战赛 B题 城市轨道交通列车时刻表优化问题 原题再现: 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发(或通过)时刻,其在实际…...

数字农业产业链整体建设方案
1. 引言 数字农业产业链整体建设方案旨在通过数字化手段提升农业产业效率与质量,推动农业现代化进程。方案聚焦于资源数字化、产业数字化、全局可视化与决策智能化的实现,构建农业产业互联网平台,促进农业全流程、全产业链线上一体化发展。 …...
awk那些事儿:在awk中使用shell变量的两种方式
awk是Linux中一款非常好用的程序,可以逐行处理文件,并提供了强大的语法和函数,和grep、sed一起被称为“Linux三剑客”。 在使用awk处理文件时,有时会用到shell中定义的变量,由于在shell中变量的调用方式是通过$符号进…...

大数据面试题--kafka夺命连环问(后10问)
目录 16、kafka是如何做到高效读写? 17、Kafka集群中数据的存储是按照什么方式存储的? 18、kafka中是如何快速定位到一个offset的。 19、简述kafka中的数据清理策略。 20、消费者组和分区数之间的关系是怎样的? 21、kafka如何知道哪个消…...
智能量化交易的多样化策略与风险控制:中阳模型的应用与发展
随着金融市场的不断创新与发展,智能量化交易正逐渐成为金融投资的重要手段。中阳智能量化交易模型通过技术优势、策略优化与实时风险控制等多方面结合,为投资者提供了强有力的工具支持。本文将对中阳量化模型的技术细节、多策略组合与市场适应性进行深入…...

小皮PHP连接数据库提示could not find driver
最近遇到一个奇怪的问题,我的小皮上安装的8.0.2版本的php连接数据库正常。下载使用8.2.9时,没有php.ini,把php-development.ini改成 php.ini后,就提示could not find driver。 网上查了说把php.ini里的这几个配置打开,我也打开了&…...

2024.11.13(一维数组相关)
思维导图 1> 提示并输入一个字符串,统计该字符串中大写字母、小写字母、数字字符、空格字符的个数并输出 2> 提示并输入一个字符串,将该字符串中的所有字母挑选到一个新数组中,将所有的数字字符挑选到另一个新数组中。并且将数字字符对…...

豆包MarsCode算法题:数组元素之和最小化
数组元素之和最小化 问题描述思路分析分析思路解决方案 参考代码(Python)代码分析1. solution 函数2. 计算 1 2 3 ... n 的和3. 乘以 k 得到最终的数组元素之和4. 主程序(if __name__ __main__:)代码的时间复杂度分析&#x…...

Hbase Shell
一、启动运行HBase 首先登陆SSH,由于之前在Hadoop的安装和使用中已经设置了无密码登录,因此这里不需要密码。然后,切换至/usr/local/hadoop,启动Hadoop,让HDFS进入运行状态,从而可以为HBase存储数据&#…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...