如何用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
相关产品推荐
相关产品推荐

