java解析xml文本的示例方法

 更新时间:2024年12月25日 09:36:10   作者:程序员老王wd  
这篇文章主要为大家详细介绍了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) {
        // 记录异常并抛出 ApiException
        throw 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 数据)中解析出特定元素的值,并根据解析结果进行后续处理的功能。整体流程包括以下几个关键步骤:

1.准备解析环境

首先,创建DocumentBuilderFactory实例,通过调用DocumentBuilderFactory.newInstance()方法来获取一个工厂对象,用于创建DocumentBuilder实例。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2.创建 DocumentBuilder 使用前面获取的工厂对象创建DocumentBuilder实例,这是实际用于解析 XML 的构建器。

DocumentBuilder builder = factory.newDocumentBuilder();

3.解析 XML 数据 将存储 XML 数据的object转换为字节流,并使用创建好的DocumentBuilder进行解析,得到代表整个XML 文档结构的Document对象。同时,对文档元素进行规范化处理(例如处理文本节点的空白等)。

Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();

4.提取特定元素的值

提取 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."));
}

5.提取 Body 元素的值(虽然代码中未完整展示对 Body 元素内容的详细处理,但获取了该元素的节点列表):

同样使用getElementsByTagName方法获取所有名为Body的元素,得到一个NodeList。

NodeList bodyList = doc.getElementsByTagName("Body");

6.提取 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();
            // 创建DocumentBuilder
            DocumentBuilder 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文本的示例方法的文章就介绍到这了,更多相关java解析xml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过实例解析java8中的parallelStream

    通过实例解析java8中的parallelStream

    这篇文章主要介绍了通过实例解析java8中的parallelStream,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • List集合多线程并发条件下不安全如何解决

    List集合多线程并发条件下不安全如何解决

    List是我们常用的集合,但是在多线程并发的条件下,会出现安全问题吗?下面我们就来测试一下,如果出现安全问题,该如何解决,感兴趣的可以了解一下
    2021-12-12
  • MyBatis-Plus实用篇超完整教程

    MyBatis-Plus实用篇超完整教程

    MyBatis-Plus是一个MyBatis的增强工具,提供了许多便捷的功能,简化了开发流程,同时,MyBatis-Plus提供了链式查询与修改、静态工具类、自定义SQL、IPage的泛型转换、ActiveRecord等扩展功能,以及分页插件和MyBatisX插件等插件,进一步提高了开发效率,感兴趣的朋友一起看看吧
    2025-02-02
  • Spring基于注解读取外部配置文件

    Spring基于注解读取外部配置文件

    这篇文章主要介绍了Spring基于注解读取外部配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 一文彻底掌握Java中的Lambda表达式

    一文彻底掌握Java中的Lambda表达式

    Lambda表达式是Java 8引入的一项重要功能,它允许我们以更简洁和灵活的方式编写代码,这篇文章主要介绍了Java中Lambda表达式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • SpringBoot ResponseBody返回值处理的实现

    SpringBoot ResponseBody返回值处理的实现

    这篇文章主要介绍了SpringBoot ResponseBody返回值处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringMVC用XML方式实现AOP的方法示例

    SpringMVC用XML方式实现AOP的方法示例

    这篇文章主要介绍了SpringMVC用XML方式实现AOP的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • SpringBoot实现整合多数据源的全攻略

    SpringBoot实现整合多数据源的全攻略

    在实际开发中,单数据源往往无法满足复杂的业务场景,本文将从实际业务需求出发,拆解 SpringBoot 中多数据源的核心实现方式,并附上可直接运行的代码示例,需要的可以了解下
    2026-03-03
  • SpringBoot如何升级到3.0

    SpringBoot如何升级到3.0

    这篇文章主要介绍了SpringBoot如何升级到3.0问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • spring boot接收请求常用注解示例详解

    spring boot接收请求常用注解示例详解

    这篇文章介绍了Spring Boot中常用的接收请求的注解,包括`@RequestBody`、`@PathVariable`、`@RequestParam`和`@DateTimeFormat`,并提供了每个注解的示例,感兴趣的朋友跟随小编一起看看吧
    2025-02-02

最新评论