xmlgroovy

How to modify XML node value depending on another node value using groovy script


<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>

In above xml I would like to set value of <DELETED_FLAG> to “X” If <PAYTERM_LABEL> contains “DO NOT USE”

Thanks for any advice


Solution

  • Simple find/replace would do (modified your original XML for brevity):

    import groovy.xml.*
      
    def xml = new XmlParser().parseText '''
    <Products>
    <Product>
      <PAYTERM_LABEL>Test 1</PAYTERM_LABEL>
      <CurrencyCode>EUR</CurrencyCode>
      <DELETED_FLAG>X</DELETED_FLAG>
    </Product>
    <Product>
      <PAYTERM_LABEL>Test 222</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>
    '''
    
    xml.grep{ 'DO NOT USE' == it.PAYTERM_LABEL.text() }*.DELETED_FLAG*.replaceNode{ DELETED_FLAG 'X' }
    
    XmlUtil.serialize xml
    

    returns

    <?xml version="1.0" encoding="UTF-8"?><Products>
        
      <Product>
            
        <PAYTERM_LABEL>Test 1</PAYTERM_LABEL>
            
        <CurrencyCode>EUR</CurrencyCode>
            
        <DELETED_FLAG>X</DELETED_FLAG>
          
      </Product>
        
      <Product>
            
        <PAYTERM_LABEL>Test 222</PAYTERM_LABEL>
            
        <CurrencyCode>EUR</CurrencyCode>
            
        <DELETED_FLAG>NO</DELETED_FLAG>
          
      </Product>
        
      <Product>
            
        <PAYTERM_LABEL>DO NOT USE</PAYTERM_LABEL>
            
        <CurrencyCode>EUR</CurrencyCode>
            
        <DELETED_FLAG>X</DELETED_FLAG>
          
      </Product>
      
    </Products>