Search code examples
xmlgrailsgroovyxml-parsingxmldocument

Groovy:XMl: How to remove and replace child tag with in a chid tag


I have an xml request i need to create another xml with request with this request without certain child tags

String requestXml = """
<School>
    <Classes>
        <Class>
           <Teachers>
              <Name>Rama</Name>
              <Name>Indhu</Name>
           </Teachers>
           <Name>Anil</Name>
           <RollNumber>16</RollNumber>
        </Class>
        <Class>
            <Teachers>
              <Name>Nisha</Name>
              <Name>Ram</Name>
           </Teachers>
           <Name>manu</Name>
           <RollNumber>21</RollNumber>
        </Class>
   </Classes>
</School>
""" 

this is the request which i have,i need to create another request with this one and it would be like this in myRequest

String myRequest = """
<School>
   <Classes>
      <Class>
         <Name>Anil</Name>
         <RollNumber>16</RollNumber>
      </Class>
      <Class>
         <Name>manu</Name>
         <RollNumber>21</RollNumber>
      </Classes>
</School>
"""

how can i achive this by using

parsed = new XmlSlurper (false, false).parseText( requestXml )

String myRequest = new StreamingMarkupBuilder().bind {
    mkp.yield parsed.Classes.children()
}

How can i remove the <Teachers> tag? also how to remove the tag <RollNumber>21</RollNumber> and insert new tag <Rank>2</Rank>


Solution

  • You can use replaceNode() on the node that is needed to be removed. It applies to all Teachers nodes under Classes parent.

    import groovy.xml.XmlUtil
    
    def xml = '''
    <School>
        <Classes>
            <Class>
               <Teachers>
                  <Name>Rama</Name>
                  <Name>Indhu</Name>
               </Teachers>
               <Name>Anil</Name>
               <RollNumber>16</RollNumber>
            </Class>
            <Class>
                <Teachers>
                  <Name>Nisha</Name>
                  <Name>Ram</Name>
               </Teachers>
               <Name>manu</Name>
               <RollNumber>21</RollNumber>
            </Class>
       </Classes>
    </School>
    '''
    
    def parsed = new XmlSlurper().parseText( xml )
    
    //Remove all Teachers node
    parsed.Classes.Class.Teachers.replaceNode { }
    
    XmlUtil.serialize( parsed )