2010-07-23 20 views
8

Estoy intentando depurar un macrodef en Ant. Parece que no puedo encontrar una forma de mostrar el contenido de un parámetro enviado como un elemento.Macrodef Ant: ¿Hay alguna manera de obtener el contenido de un parámetro de elemento?

<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> 

Ejemplo ejecute:

$ 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. 
... 

así que supongo que necesita ya sea una forma de obtener los contenidos del <elem /> en una propiedad de alguna manera (algunos aplicación macrodef extendida podría tener que), o necesito una tipo de <element-echo><elem /></element-echo> que podría imprimir cualquier árbol XML que ponga dentro. ¿Alguien sabe de una implementación de cualquiera de estos? Cualquier tercera forma no anticipada de obtener los datos es, por supuesto, también bienvenida.

Respuesta

9

¿Qué tal la tarea echoxml?

En su ejemplo fichero de construcción sustitución de la línea

<echo>The element works only in restricted cases: <elem /> </echo> 

con

<echoxml><elem /></echoxml> 

resultados en

$ 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> 

Quizás la declaración XML no se quiere sin embargo. Puede usar el atributo echoxml file para colocar la salida en un archivo temporal, luego leer ese archivo y eliminar la declaración, o reformatear la información como mejor le parezca.

edición

Pensándolo bien, es probable que pueda estar cerca de lo que usted describe, por ejemplo, este cuerpo secuencial de su 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> 

da

$ 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> 
+0

El '' Elemento era exactamente lo que estaba buscando, ¡gracias! – clacke

+0

Como una ventaja, el '' funciona incluso sin el procesamiento adicional para agregar los encabezados XML (probados en la hormiga 1.8.4). –

Cuestiones relacionadas