Java 根据XPATH批量替换XML节点中的值

根据XPATH批量替换XML节点中的值

by: 授客 QQ:1033553122

测试环境

JDK 1.8.0_25

代码实操

_message.xml_文件


        xxxxxxxxxx12Ur8v6qkYAaOf
        xxxxxxxxxxkmPif7Z35UEJjrR

            Wxxxxxxxxxx

                    xxxxxxx
                    SO20220519xxxx13190
                    3
                    10
                    未知地址

                        个人
                        凯琳
                        中国
                        广东省
                        江门市
                        蓬江区
                        详细地址

                            1001178
                            保妇康栓1.74g*14粒/盒
                            1

                            1008766
                            美团小药箱
                            1

XMLHelper.java

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

public class XMLHelper {
    // XML文件转XML文档对象
    public static Document xmlFileToDocument(String filePath) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setValidating(false);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new FileInputStream(new File(filePath)));
        return doc;
    }

    // XML文档转XML字符串
    public static String docToString(Document doc) throws TransformerException {
        TransformerFactory ft = TransformerFactory.newInstance();
        Transformer ff = ft.newTransformer();
        ff.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        ff.setOutputProperty("encoding", "gbk");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ff.transform(new DOMSource(doc), new StreamResult(bos));
        return bos.toString();
    }

    // XML字符串转XML文档对象
    public static Document stringToDocument(String xmlData) throws Exception {
        StringReader sr = new StringReader(xmlData);
        InputSource is = new InputSource(sr);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }

    // 替换单个XPATH指定的XML节点值
    public static void replaceXmlNodeValue(Document doc, String nodePath, String value) throws XPathExpressionException {
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        // 匹配需替换的节点
        NodeList nodeList = (NodeList) xpath.evaluate(nodePath, doc, XPathConstants.NODESET);

        // 单个XPATH可能匹配多个XML节点,所以需要遍历替换
        for (int i = 0; i < nodeList.getLength(); i++) {
            nodeList.item(i).setTextContent(value);
        }
    }

    // 批量多个XPATH指定的XML节点值
    public static void replaceXmlNodesValue(Document doc, List nodesPath, String value) throws XPathExpressionException {
        for (String nodePath : nodesPath) {
            XMLHelper.replaceXmlNodeValue(doc, nodePath, value);
        }
    }

    public static void replaceReceiverAddress(Document doc, String value) throws Exception{
        List nodesPath= new ArrayList();
        nodesPath.add(".//OrderReceiverInfo/ReceiverAddress");
        nodesPath.add(".//receiverAddress");

        XMLHelper.replaceXmlNodesValue(doc, nodesPath, value);
    }

    public static void main(String []args) {
        try {
            Document doc = XMLHelper.xmlFileToDocument("message.xml");

            // 替换地址
            XMLHelper.replaceReceiverAddress(doc, "吉祥街道幸福社区1号大楼23号");

            String newXml = XMLHelper.docToString(doc);
            System.out.println(newXml);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视
文字过少占位符,可无视

Original: https://www.cnblogs.com/shouke/p/16663766.html
Author: 授客
Title: Java 根据XPATH批量替换XML节点中的值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620306/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka、Feign、Hystrix、Config,本篇来学习下API网关zuul。在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的u…

    Java 2023年5月30日
    0106
  • Day9

    package array;public class ArrayDemo1 { //变量类型 变量的名字 = 变量的值 //数组类型 public static void main…

    Java 2023年6月5日
    061
  • ArrayList

    1、定义 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList…

    Java 2023年6月5日
    077
  • markdown mermaid流程图

    流程图 所有流程图都由节点、几何图像、箭头或线条组成。 mermaid代码定义了这些节点和边的制作和交互方式。可以有不同的箭头类型、多向箭头以及与子图的连接。 flowchart …

    Java 2023年6月5日
    076
  • 盲撸 Ant Design Pro 开篇

    碎语 本人是从事后端开发,但是自己一直是前后端都写的,之前一直使用vue,因为vue简单么上手快,但是vue一直感觉没有特别好用的中台框架,最近打算撸一撸 Ant Design P…

    Java 2023年6月8日
    0111
  • java Filter过滤器例外URL设置

    在web.xml声明的一个filter中: > 可以看到url-pattern的设置里面过滤的url规则是/admin/*,如果要把/admin/login.do排除在过滤u…

    Java 2023年5月29日
    056
  • git 版本控制命令笔记

    git 获取与创建项目 你得先有一个git仓库,才能用它进行操作。仓库是Git存放你要保存的快照的地方。 创建仓库的两种方式: init 通过命令行初始化。 clone 如果我们想…

    Java 2023年6月8日
    088
  • 女朋友说:你要搞懂了MySQL三大日志,我就让你嘿嘿嘿!

    1. 背景 MySQL实现事务、崩溃恢复、集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在。只有了解MySQL日志,才算是彻底搞懂MySQL。 今天一灯就带你深入浅…

    Java 2023年6月8日
    0108
  • 可恶,又是个线上问题

    这几天,在搞 ShardingSphere,这不又来了一个问题嘛,启动的时候报了一个NPE出来。 好在,这个问题不影响使用,只是启动会报点错,接下来,又是辛苦的排查过程。 直接定位…

    Java 2023年6月13日
    078
  • Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 今天松哥就来和大家聊聊 Sp…

    Java 2023年5月30日
    0102
  • 戏说领域驱动设计(十四)——补遗

    写了好几章的东西,再回头读的时候发现有些内容写的不理想,没有表达出自己所想要表达的意思。这次写一个补遗,把我认为需要重新解释和着重说明的内容再唠一唠。反正我多说两句,您就可以多理解…

    Java 2023年6月7日
    063
  • JavaWeb入门

    1.Web概念概述 JavaWeb:使用Java语言开发基于互联网的项目 1.1 软件架构 C/S:Client/Server 客户端、服务器端 在用户本地有一个客户端程序,在远程…

    Java 2023年6月6日
    082
  • Java中的4种 I/O 模型

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/franson-2016/p/13262212.html…

    Java 2023年5月29日
    092
  • ssh 登陆远程nohup java 脚本无效,但设置生效后日志中文乱码

    该日志说到了两个问题,分别解答: (1)ssh 登陆远程调用含有nohup java的启动脚本失败 (2)ssh 登陆远程调用启动脚本生效后,但是日志中出现中文乱码 场景:jenk…

    Java 2023年5月29日
    073
  • SpringBoot项目解决全局响应返回中文乱码问题

    一、问题 新建的基于SpringBoot的MVC项目,在请响应体中,如果有中文,会显示为乱码。 二、解决方案 1、在application.properties中设置: Origi…

    Java 2023年5月30日
    078
  • IDEA 设置文件编码

    打开设置,快捷键 CTRL+ALT+S或点击设置小齿轮。 建议设置成这样,统一编码,配置文件自动转换 ascii 也勾上。最后OK。 对单个文件进行设置编码,在IDEA主窗口右下角…

    Java 2023年6月7日
    0133
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球