使用ANT注释掉外部文件中的XML标记

时间:2013-11-06 12:28:27

标签: xml ant comments

我正在寻找使用ANT在外部XML文件中注释掉XML标记的最简单方法。由于某种原因,XMLTask有一个取消注释的功能,但没有注释。

我可以用replaceregexp或者替换来实现这一点,但我不愿意,因为看起来应该有一个更简单的方法。

例如,假设我有file.xml:

<KeepMeTag someAttribute="something">
<SomeOtherTag someAttribute="something" />

...我怎么能用ANT注释掉SomeOtherTag,看起来像是这样:

<!-- <SomeOtherTag someAttribute="something" /> -->

请注意,真实标签实际上本身有一些正则表达式,以及其他几个属性,并且相当长。所以,我更喜欢通过XPath访问SomeOtherTag标签的方法,只是说“评论!”......如果这是可能的,而不是“替换”特定字符串的出现,因为a)它很长添加到我的构建中,以及b)如果XML稍微改变,可能会破坏构建。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

看看replaceregex task。那应该可以做到这一点。为了便于在多个地方使用,您可以将其包装在macrodef

它可能看起来像这样。我没有测试过这个。请注意,它不会处理用属性值

写的>
<macrodef name="outcomment">
  <attribute name="file">
  <attribute name="tagName">
  <sequential>
    <replaceregexp file="@{file}"
           match="(<@{tagname}[^>]/>)"
           replace="<!--\1 -->"
     />
  </sequential>
</macrodef>

请注意,正则表达式很难匹配嵌套标记。如果您只有其他类型的嵌套标记,则可以匹配结束标记。如果您具有相同名称的嵌套标记,则不可能。

如果您想要更高级的内容,请考虑writing your own task

答案 1 :(得分:1)

使用Saxon-B 9.1.0.8,您可以拥有一个非常干净的解决方案:

source.xml

<root>
    <KeepMeTag someAttribute="something">
        <SomeOtherTag someAttribute="something" />
    </KeepMeTag>
</root>

的build.xml

<project name="ant-xslt-comment-out-element" default="run" basedir=".">
    <target name="run">
        <fail unless="out.dir"/>

        <xslt 
            style="transform.xsl"
            includes="source.xml"
            destdir="${out.dir}"
        >
            <factory name="net.sf.saxon.TransformerFactoryImpl"/>
            <identitymapper/>
        </xslt>
    </target>
</project>

transform.xsl

<?xml version="1.0"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:saxon="http://saxon.sf.net/"
>
    <xsl:output method="xml" indent="yes" />

    <!-- To serialize with saxon:serialize() -->
    <xsl:output name="default" indent="yes" omit-xml-declaration="yes"/>

    <!-- XSLT identity transformation -->
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="SomeOtherTag">
        <xsl:comment>
            <xsl:value-of select="saxon:serialize(., 'default')" />
        </xsl:comment>
    </xsl:template>
</xsl:stylesheet>

Ant命令

ant -lib saxon9.jar

生成的XML

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <KeepMeTag someAttribute="something">
        <!--<SomeOtherTag someAttribute="something"/>-->
    </KeepMeTag>
</root>

答案 2 :(得分:-1)

在名为xmltask的工作期间遇到了另一项蚂蚁任务。引用他们自己的介绍:

  

xmltask提供了自动编辑XML文件的工具,作为Ant构建的一部分。与Ant提供的标准过滤器任务不同,它对XML敏感,但不要求您定义XSLT。

我对此没有经验,但请查看文档: http://www.oopsconsultancy.com/software/xmltask/