获取 Ant 元素中保存的值

Get value held in Ant element

假设我有一个像这样的 macrodef

<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 文档中似乎也没有很好地涵盖它,所以如果不可能的话,有没有办法拥有一个可选属性?

编辑:拼写

我总是这样做:

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

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

希望对您有所帮助。

如果元素只有文本内容,则使用简单的 echo,f.e。 :

<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、f.e。 :

<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 进行归档,然后使用 loadfile
--评论后编辑--
回显到文件:

<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 => 创建带有内容的 属性(= 字符串)。
当使用带过滤链的 xml header 的 echoxml strip 时:

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

根据您的需要调整 headfilter lines 属性的值。
属性 任何值都会有 :

<echo>blablabla..</echo>