使用shell scrpit取消注释xml文件中的部分

时间:2018-02-20 11:48:46

标签: linux bash shell sh

我有一个XML文件,其内容已注释部分。我的要求是使用shell脚本取消注释。任何帮助将受到高度赞赏。

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

2 个答案:

答案 0 :(得分:2)

使用 xsltproc ,您需要此文件 my.xsl 来处理您的xml输入:

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

假设您的输入文件 my.xml 如下所示:

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

现在,您可以运行下一个命令:

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

sed 转换是恢复'&lt;'所必需的和'&gt;'输出中的字符。

这为您提供以下输出:

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

如果您不想取消注释所有注释,则可以编写更具体的规则,以仅选择要取消注释的注释节点。如果你不知道如何,只要求它。

答案 1 :(得分:0)

在输出文件中添加特殊字符串转义所需的 disable-output-escaping =“yes” ...

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