0

假设我有一个这样的宏定义

<macrodef name="Test">
    <element name="someName"/>
    <sequential>
        <java classname="path_to_Test">
            <classpath> blah </classpath>
            <arg value="someText and {valueOfsomeName}"/>
        </java>
    </sequential>
</macrodef>

然后再往下,我有一个使用这个宏定义的目标,比如

<target name="testMacrodef">
    <Test>
        <someName value="someValue"/>
    </Test>
</target>

我的问题是,我如何才能{valueOfsomeName}成为字符串someValue?我似乎根本无法让它工作。

另外,就一些上下文而言,我不能只使用属性标记而不是元素标记,因为我需要它作为可选参数。

我已经用谷歌搜索了很长时间,试图找到解决方案;也许没有。但据我所知,没有人问过这个问题,而且 Ant 文档中似乎也没有很好地涵盖它,所以如果不可能,有没有办法拥有一个可选属性?

编辑:拼写

4

2 回答 2

1

如果元素只有文本内容 fe ,则使用简单的回显:

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echo>
    <someName/>
   </echo>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>
</macrodef>

<Test>
 <someName>blablabla..</someName>
</Test>

输出 :

[echo]     
[echo]    blablabla..
[echo]  @{foo} => bar

否则对于嵌套的 xml 内容使用echoxml, fe :

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echoxml>
    <someName/>
   </echoxml>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>
</macrodef>

<Test>
 <someName>
  <echo>blablabla..</echo>
 </someName>
</Test>

输出 :

<?xml version="1.0" encoding="UTF-8"?>
<echo>blablabla..</echo>
[echo]  @{foo} => bar

如果您需要元素值进行进一步处理,请使用 echo / echoxml 归档并之后加载文件。
-- 评论后编辑 --
回显到文件:

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echo file="somefile.txt">
    <someName/>
   </echo>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>

或者

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echoxml file="somefile.txt">
    <someName/>
   </echoxml>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>

然后使用 loadfile => 使用内容创建属性(= 字符串)。
当使用带有 filterchain 的 xml 标头的 echoxml 条时:

<loadfile srcfile=" ... " property="whatever">
 <filterchain>
  <headfilter lines="10" skip="1"/>
 </filterchain>
</loadfile>

根据您的需要调整 headfilter 线属性的值。
任何具有价值的财产:

<echo>blablabla..</echo>
于 2015-08-28T13:21:54.793 回答
0

我总是做这样的事情:

<macrodef name="test">
    <attribute name="foo"/>
    <sequential>
        <echo message="@{foo}"></echo>
    </sequential>
</macrodef>

<target name="so">
    <test foo="Hello SO." />
</target>

希望这可以帮助。

于 2015-08-28T13:00:58.310 回答