Я пытаюсь отладить macrodef у Муравья. Я, может казаться, не нахожу способ отобразить содержание параметра, отправленного как элемент.
<project name='debug.macrodef'>
<macrodef name='def.to.debug'>
<attribute name='attr' />
<element name='elem' />
<sequential>
<echo>Sure, the attribute is easy to debug: @{attr}</echo>
<echo>The element works only in restricted cases: <elem /> </echo>
<!-- This works only if <elem /> doesn't contain anything but a
textnode, if there were any elements in there echo would
complain it doesn't understand them. -->
</sequential>
</macrodef>
<target name='works'>
<def.to.debug attr='contents of attribute'>
<elem>contents of elem</elem>
</def.to.debug>
</target>
<target name='does.not.work'>
<def.to.debug attr='contents of attribute'>
<elem><sub.elem>contents of sub.elem</sub.elem></elem>
</def.to.debug>
</target>
</project>
Пример выполняется:
$ ant works
...
works:
[echo] Sure, the attribute is easy to debug: contents of attribute
[echo] The element works only in restricted cases: contents of elem
...
$ ant does.not.work
...
does.not.work:
[echo] Sure, the attribute is easy to debug: contents of attribute
BUILD FAILED
.../build.xml:21: The following error occurred while executing this line:
.../build.xml:7: echo doesn't support the nested "sub.elem" element.
...
Таким образом, я предполагаю, что мне нужен любой способ получить содержание <elem />
в свойство так или иначе (некоторые расширили macrodef реализацию, мог бы иметь это), или мне нужен своего рода <element-echo><elem /></element-echo>
это могло распечатать любое дерево XML, которое Вы вставляете. Кто-либо знает о реализации любого из них? Любой третий, непредвиденный способ вывести данные, конечно, также приветствуется.
Как насчет задачи echoxml
?
В вашем примере файла сборки замена строки
<echo>The element works only in restricted cases: <elem /> </echo>
на
<echoxml><elem /></echoxml>
приводит к
$ ant does.not.work
...
does.not.work:
[echo] Sure, the attribute is easy to debug: contents of attribute
<?xml version="1.0" encoding="UTF-8"?>
<sub.elem>contents of sub.elem</sub.elem>
Возможно, объявление XML не требуется. Вы можете использовать атрибут echoxml file
, чтобы поместить вывод во временный файл, затем прочитать этот файл и удалить объявление или переформатировать информацию по своему усмотрению.
edit
Поразмыслив, вы, вероятно, сможете приблизиться к тому, что вы описываете, например, это последовательное тело вашего macrodef
<sequential>
<echo>Sure, the attribute is easy to debug: @{attr}</echo>
<echoxml file="macro_elem.xml"><elem /></echoxml>
<loadfile property="elem" srcFile="macro_elem.xml">
<filterchain>
<LineContainsRegexp negate="yes">
<regexp pattern=".xml version=.1.0. encoding=.UTF-8..." />
</LineContainsRegexp>
</filterchain>
</loadfile>
<echo message="${elem}" />
</sequential>
дает
$ ant does.not.work
...
does.not.work:
[echo] Sure, the attribute is easy to debug: contents of attribute
[echo] <sub.elem>contents of sub.elem</sub.elem>