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

测试环境:

JDK 1.8.0_25

代码实操:

message.xml文件

<Request service="SALE_ORDER_SERVICE" lang="zh-CN">
    <Head>
        <AccessCode>xxxxxxxxxx12Ur8v6qkYAaOf</AccessCode>
        <Checkword>xxxxxxxxxxkmPif7Z35UEJjrR</Checkword>
    </Head>
    <Body>
        <SaleOrderRequest>
            <CompanyCode>Wxxxxxxxxxx</CompanyCode>
            <SaleOrders>
                <SaleOrder>
                    <WarehouseCode>xxxxxxx</WarehouseCode>
                    <ErpOrder>SO20220519xxxx13190</ErpOrder>
                    <ErpOrderType>3</ErpOrderType>
                    <orderType>10</orderType>
                    <receiverAddress>未知地址</receiverAddress>
                    <OrderReceiverInfo>
                        <ReceiverCompany>个人</ReceiverCompany>
                        <ReceiverName>凯琳</ReceiverName>
                        <ReceiverCountry>中国</ReceiverCountry>
                        <ReceiverProvince>广东省</ReceiverProvince>
                        <ReceiverCity>江门市</ReceiverCity>
                        <ReceiverArea>蓬江区</ReceiverArea>
                        <ReceiverAddress>详细地址</ReceiverAddress>
                    </OrderReceiverInfo>
                    <OrderItems>
                        <OrderItem>
                            <SkuNo>1001178</SkuNo>
                            <ItemName>保妇康栓1.74g*14粒/盒</ItemName>
                            <ItemQuantity>1</ItemQuantity>
                        </OrderItem>
                        <OrderItem>
                            <SkuNo>1008766</SkuNo>
                            <ItemName>美团小药箱</ItemName>
                            <ItemQuantity>1</ItemQuantity>
                        </OrderItem>
                    </OrderItems>
                </SaleOrder>
            </SaleOrders>
        </SaleOrderRequest>
    </Body>
</Request>

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<String> 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();
        }

    }
}

到此这篇关于Java 根据XPATH批量替换XML节点中的值的文章就介绍到这了,更多相关Java替换XML节点值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java使用xpath解析xml示例分享

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初 XPath 的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是 XPath 很快的被开发者采用来当作小型查询语言. XPathTest.java 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java

  • JAVA通过XPath解析XML性能比较详解

    最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).D

  • Java通过XPath获取XML文件中符合特定条件的节点

    在Java解析XML文件的过程中,有时需要获取符合某些特定条件的节点,以下是实现代码. import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.eclipse.swt.widgets.Shell; import org.ec

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

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

    测试环境: JDK 1.8.0_25 代码实操: message.xml文件 <Request service="SALE_ORDER_SERVICE" lang="zh-CN"> <Head> <AccessCode>xxxxxxxxxx12Ur8v6qkYAaOf</AccessCode> <Checkword>xxxxxxxxxxkmPif7Z35UEJjrR</Checkword> &l

  • 使用python批量修改XML文件中图像的depth值

    最近刚刚接触深度学习,并尝试学习制作数据集,制作过程中发现了一个问题,现在跟大家分享一下.问题是这样的,在制作voc数据集时,我采集的是灰度图像,并已经用labelimg生成了每张图像对应的XML文件.训练时发现好多目标检测模型使用的训练集是彩色图像,因此特征提取网络的输入是m×m×3的维度的图像.所以我就想着把我采集的灰度图像的深度也改成3吧.批量修改了图像的深度后,发现XML中的depth也要由1改成3才行.如果重新对图像标注一遍生成XML文件的话太麻烦,所以就想用python批量处理一下.

  • python批量修改xml文件中的信息

    目录 项目场景: 问题描述: 分析: 解决方案: 总结 项目场景: 在做目标检测时,重新进行标注会耗费大量的时间,如果能够批量对xml中的信息进行修改,那么将会节省大量的时间,接下来将详细介绍如何修改标注文件xml中的相关信息. 问题描述: 例如:当我有一批标注好的xml文件,文件格式如下图所示 : <?xml version='1.0' encoding='us-ascii'?> <annotation> <folder>VOC2012</folder>

  • Java在利用反射条件下替换英文字母中的值

    Java在利用反射条件下替换英文字母中的值 (1)创建两个Class: ReflectTest类如下: package cn.itcast.day01; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class ReflectTest { public static void main(String[] args) throws Exception { changeStringValue(

  • java正则替换img标签中src值的方法

    主要功能是: 替换html字符串中img标签src的值. 代码如下: package com.junlenet.common.util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * html处理工具类 * @author huweijun * @date 2016年7月13日 下午7:25:09 */ public class HtmlUtils { /** * 替换指定标签的属性和值 * @para

  • python实现的批量分析xml标签中各个类别个数功能示例

    本文实例讲述了python实现的批量分析xml标签中各个类别个数功能.分享给大家供大家参考,具体如下: 文章目录 需要个脚本分析下各个目标的数目 顺带练习下多进程,自用,直接上代码: # -*- coding: utf-8 -*- # @Time : 2019/06/10 18:56 # @Author : TuanZhangSama import os import xml.etree.ElementTree as ET from multiprocessing import Pool,fre

  • C#通过XML节点属性/属性值读取写入XML操作代码实例

    1.XML的内容如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?><root>  <title>    <settings id = "0" name = "显示文字">欢迎您!智慧服务,互动体验......</settings>    <settings id = "1" name

  • mybatis Mapper的xml文件中resultType值的使用说明

    目录 Mapper的xml文件中resultType值 ①返回一般数据类型的值 ②当返回类型是javaBean ③当返回是List类型 ④返回类型数Map结构 ⑤说一下关于mybatis里面mapper层中传入多个参数的方法 mybatis学习之resultType解析 总结 1.对象类型 2.List类型 3.Map类型 Mapper的xml文件中resultType值 ①返回一般数据类型的值 比如根据id或者字段条件查询获取表中的某一个字段值 User Sel(int id); //根据id

  • Python练习之读取XML节点和属性值的方法

    面试题 有一个test.xml文件,要求读取该文件中products节点的所有子节点的值以及子节点的属性值. test.xml文件: <!-- products.xml --> <root> <products> <product uuid='1234'> <id>10000</id> <name>苹果</name> <price>99999</price> </product&g

  • 使用@value注解取不到application.xml配置文件中的值问题

    目录 @value注解取不到application.xml的值 报错信息 原来代码 问题原因 思考 拓展阅读 工具类@Value取不到值 原因是new的对象 @value注解取不到application.xml的值 报错信息 今天从码云上拉下来代码,突然发现系统跑不起来了,报错信息如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroConfig': Inj

随机推荐