Search code examples
linuxbashshellsh

Uncomment section in xml file using shell script


I have an XML file which contents a commented section. My requirement is to uncomment it using a shell script. Any help would be highly appreciated.

<!--<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
        <parameter name="mail.smtp.from">xx</parameter>
        <parameter name="mail.smtp.user">xx</parameter>
        <parameter name="mail.smtp.password">xx</parameter>
        <parameter name="mail.smtp.host">smtp.gmail.com</parameter>
        <parameter name="mail.smtp.port">587</parameter>
        <parameter name="mail.smtp.starttls.enable">true</parameter>
        <parameter name="mail.smtp.auth">true</parameter>
    </transportSender>-->

Solution

  • Using xsltproc, you will need this file my.xsl to process your xml input:

    <?xml version="1.0" encoding="utf-8"?>
    
    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml" indent="yes" encoding="utf-8"/>
    
      <xsl:template match="@*|node()"><!-- identity transformation -->
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="comment()"><!-- comments transformation -->
        <xsl:value-of select="."/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    Assuming your input file my.xml looks like this:

    <?xml version="1.0" ?>
    <my-tag>
      <!--<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
            <parameter name="mail.smtp.from">xx/parameter>
            <parameter name="mail.smtp.user">xx</parameter>
            <parameter name="mail.smtp.password">xx</parameter>
            <parameter name="mail.smtp.host">smtp.gmail.com</parameter>
            <parameter name="mail.smtp.port">587</parameter>
            <parameter name="mail.smtp.starttls.enable">true</parameter>
            <parameter name="mail.smtp.auth">true</parameter>
        </transportSender>-->
    </my-tag>
    

    Now, you can run next command:

    xsltproc my.xsl my.xml | sed -e 's/&lt;/</g' -e 's/&gt;/>/g'
    

    The sed transformation was necessary to restore the '<' and '>' chars in the output.

    This gives you following output:

    <?xml version="1.0" encoding="utf-8"?>
    <my-tag>
      <transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">test
            <parameter name="mail.smtp.from">xx/parameter>
            <parameter name="mail.smtp.user">xx</parameter>
            <parameter name="mail.smtp.password">xx</parameter>
            <parameter name="mail.smtp.host">smtp.gmail.com</parameter>
            <parameter name="mail.smtp.port">587</parameter>
            <parameter name="mail.smtp.starttls.enable">true</parameter>
            <parameter name="mail.smtp.auth">true</parameter>
        </transportSender>
    </my-tag>
    

    If you don't want to uncomment all the comments, you can write a more specific rule to select only the comment nodes you want to uncomment. If you don't know how, just ask for it.