java xml 文本解析

ops/2024/11/19 2:28:10/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

示例文本

xml"><Message><MessageName>time_request</MessageName><Timestamp>20220217165432906359</Timestamp><Body><EQPID>CMMAB01-DTP01</EQPID></Body>
</Message>

示例代码

java">import org.w3c.dom.Document;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
java">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()));}
java">        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 数据)中解析出特定元素的值,并根据解析结果进行后续处理的功能。整体流程包括以下几个关键步骤:

  1. 准备解析环境
    • 首先,创建DocumentBuilderFactory实例,通过调用DocumentBuilderFactory.newInstance()方法来获取一个工厂对象,用于创建DocumentBuilder实例。
java">DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  1. 创建 DocumentBuilder 使用前面获取的工厂对象创建DocumentBuilder实例,这是实际用于解析 XML 的构建器。
java">DocumentBuilder builder = factory.newDocumentBuilder();
  1. 解析 XML 数据 将存储 XML 数据的object转换为字节流,并使用创建好的DocumentBuilder进行解析,得到代表整个
    XML 文档结构的Document对象。同时,对文档元素进行规范化处理(例如处理文本节点的空白等)。
java">Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
  1. 提取特定元素的值
    提取 MessageName 元素的值:
    通过getElementsByTagName方法在解析后的Document对象中查找所有名为MessageName的元素,返回一个NodeList集合。
    然后判断该集合的长度,如果大于 0,则获取第一个MessageName元素的文本内容,并存储到textContent变量中;否则,抛出一个自定义的ApiException异常,表示缺少MessageName元素。
java">NodeList messageNameList = doc.getElementsByTagName("MessageName");
if (messageNameList.getLength() > 0) {textContent = messageNameList.item(0).getTextContent();
} else {throw new ApiException(ApiException.showStr("Missing MessageName element."));
}
  1. 提取 Body 元素的值(虽然代码中未完整展示对 Body 元素内容的详细处理,但获取了该元素的节点列表):
    同样使用getElementsByTagName方法获取所有名为Body的元素,得到一个NodeList。
java">NodeList bodyList = doc.getElementsByTagName("Body");
  1. 提取 Body 元素下特定子元素的值(以示例中的循环处理为例):
    先通过body.getElementsByTagName(“EQPID”)等类似方式获取特定子元素(如EQPID、MACHINEID、PANELID等)的第一个节点,并获取其文本内容,分别存储到对应的变量(eqpId、machineId、panelid等)中。
    对于ITEM元素下的子元素ITEMID和ITEMVALUE,通过循环遍历body.getElementsByTagName(“ITEM”)得到的NodeList,判断节点类型为元素节点后,进行强制类型转换,再分别获取其文本内容存储到相应变量(itemid和itemvalue)中。
java">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 文本信息

java">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);}}
}

http://www.ppmy.cn/ops/134840.html

相关文章

C#编程:优化【性别和成绩名次】均衡分班

标题 C#编程&#xff0c;实现&#xff08;男女和成绩&#xff09;均衡分班 正文 上一篇用ExceVBA完成的分班&#xff0c;请看文章 ExcelVBA代码实现按性别和成绩名次均衡分班 网友提出问题用VbA对班级学生随机分组&#xff0c;考虑男女人数和考试成绩均衡 一、需求分析 用户需要…

基于BERT的情感分析

基于BERT的情感分析 1. 项目背景 情感分析&#xff08;Sentiment Analysis&#xff09;是自然语言处理的重要应用之一&#xff0c;用于判断文本的情感倾向&#xff0c;如正面、负面或中性。随着深度学习的发展&#xff0c;预训练语言模型如BERT在各种自然语言处理任务中取得了…

Flink Source 详解

Flink Source 详解 原文 flip-27 FLIP-27 介绍了新版本Source 接口定义及架构 相比于SourceFunction&#xff0c;新版本的Source更具灵活性&#xff0c;原因是将“splits数据获取”与真“正数据获取”逻辑进行了分离 重要部件 Source 作为工厂类&#xff0c;会创建以下两…

【汇编】c++游戏开发

由一起学编程创作的‘C/C项目实战&#xff1a;2D射击游戏开发&#xff08;简易版&#xff09;&#xff0c; 440 行源码分享来啦~’&#xff1a; C/C项目实战&#xff1a;2D射击游戏开发&#xff08;简易版&#xff09;&#xff0c; 440 行源码分享来啦~_射击c-CSDN博客文章浏览…

配置LVGL的WIN下vscode的仿真demo

首先 我是从炸鸡佬那里推荐的文章进去&#xff0c;按照流程发现实现不了 然后搜了几个首先的错误就是找不到 lvgl/lvgl.h&#xff0c;我简直蒙蔽了&#xff0c;这个文件就在lvgl的目录下&#xff0c;即便我去手动引用也还是会出错。 然后我去别的csdn找解决方案&#xff0c;依…

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞&#xff0c;实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…

决策树基本 CART Python手写实现

参考资料&#xff1a; https://blog.csdn.net/weixin_45666566/article/details/107954454 https://blog.csdn.net/Elenstone/article/details/105328111 代码如下&#xff1a; #-*- coding:utf-8 -*- import numpy as np import pandas as pd import operatordef loadDataSe…

数据结构-布隆过滤器和可逆布隆过滤器

布隆过滤器家族 普通布隆过滤器基本原理代码实现 计数布隆过滤器基本原理代码实现 可逆布隆过滤器基本原理代码实现 参考 在解决缓存穿透问题时&#xff0c;往往会用到一种高效的数据结构-布隆过滤器&#xff0c;其能够快速过滤掉不存在的非法请求&#xff0c;但其也存在一定的…