Получить значение в элементе Ant
Допустим, у меня есть макроопределение, как так
<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, поэтому, если это невозможно, есть ли способ иметь необязательный атрибут?
РЕДАКТИРОВАТЬ: правописание
2 ответа
Используйте простое эхо, если элемент имеет только текстовое содержимое, например:
<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, например:
<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 для файла и впоследствии загрузите файл.
--EDIT после комментария -
Эхо в файл:
<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 after = = создает свойство (= string) с контентом.
При использовании echoxml strip заголовка xml с filterchain:
<loadfile srcfile=" ... " property="whatever">
<filterchain>
<headfilter lines="10" skip="1"/>
</filterchain>
</loadfile>
Адаптируйте значение атрибута линий headfilter к вашим потребностям.
Свойство все равно будет иметь значение:
<echo>blablabla..</echo>
Я всегда делаю что-то вроде этого:
<macrodef name="test">
<attribute name="foo"/>
<sequential>
<echo message="@{foo}"></echo>
</sequential>
</macrodef>
<target name="so">
<test foo="Hello SO." />
</target>
Надеюсь это поможет.