You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Groovy脚本根据XML节点值修改指定节点内容

需求描述

给定以下XML内容:

<Products>
<Product>
  <PAYTERM_LABEL>Test 1</PAYTERM_LABEL>
  <CurrencyCode>EUR</CurrencyCode>
  <DELETED_FLAG>X</DELETED_FLAG>
</Product>
<Product>
  <PAYTERM_LABEL>DO NOT USE</PAYTERM_LABEL>
  <CurrencyCode>EUR</CurrencyCode>
  <DELETED_FLAG></DELETED_FLAG>
</Product>
</Products>

需要实现:当<PAYTERM_LABEL>节点内容包含“DO NOT USE”时,将对应的<DELETED_FLAG>节点值设置为“X”。


实现方案

方案1:XSLT转换(XML标准处理方式)

适合批量XML转换场景,创建如下XSLT文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 复制所有原始节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 匹配需要修改的DELETED_FLAG节点 -->
  <xsl:template match="DELETED_FLAG[../PAYTERM_LABEL[contains(., 'DO NOT USE')]]">
    <DELETED_FLAG>X</DELETED_FLAG>
  </xsl:template>
</xsl:stylesheet>

使用XSLT处理器(如Saxon、libxslt)执行转换即可得到修改后的XML。

方案2:Python脚本(轻量灵活)

用标准库xml.etree.ElementTree:

import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('input.xml')
root = tree.getroot()

# 遍历所有Product节点
for product in root.findall('Product'):
    payterm_text = product.find('PAYTERM_LABEL').text
    deleted_node = product.find('DELETED_FLAG')
    if payterm_text and 'DO NOT USE' in payterm_text:
        deleted_node.text = 'X'

# 保存修改后的XML
tree.write('output.xml', encoding='utf-8', xml_declaration=True)

用lxml库(支持复杂XPath):

from lxml import etree

# 解析XML
tree = etree.parse('input.xml')

# 直接定位需要修改的节点
target_flags = tree.xpath("//Product[contains(PAYTERM_LABEL/text(), 'DO NOT USE')]/DELETED_FLAG")
for flag in target_flags:
    flag.text = 'X'

# 保存结果
tree.write('output.xml', encoding='utf-8', xml_declaration=True)

方案3:Java代码(企业级环境)

用DOM API实现:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;

public class XmlUpdateTool {
    public static void main(String[] args) throws Exception {
        // 解析XML文件
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document doc = factory.newDocumentBuilder().parse(new File("input.xml"));

        // 遍历所有Product节点
        NodeList productList = doc.getElementsByTagName("Product");
        for (int i = 0; i < productList.getLength(); i++) {
            Element product = (Element) productList.item(i);
            String labelText = product.getElementsByTagName("PAYTERM_LABEL").item(0).getTextContent();
            Element deletedFlag = (Element) product.getElementsByTagName("DELETED_FLAG").item(0);
            
            if (labelText.contains("DO NOT USE")) {
                deletedFlag.setTextContent("X");
            }
        }

        // 保存修改后的XML
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(doc), new StreamResult(new File("output.xml")));
    }
}

内容的提问来源于stack exchange,提问作者Aarti Dholiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:53:15