简体   繁体   中英

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

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.

Adding disable-output-escaping="yes" needed for special char escaping in output file...

<?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="." disable-output-escaping="yes" />
  </xsl:template>

</xsl:stylesheet>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM