Cómo usar bucles internos en Apache Velocity para analizar XML

Voy a desarrollar un complemento de Eclipse para generar códigos fuente de Java simples. Inicialmente, necesito convertir un archivo XML a código de clase Java. Encontré Apache Velocity en Internet y ahora estoy jugando con algunas cosas simples. Este es mi archivo XML de entrada:

<?xml version= "1.0" encoding= "UTF-8" ?> 
<Content> 
<Class name= "Customer"  acc_modif="public"> 
<attributes>
 <attribute attribute_type= "String" attribute_name= "studentName"  attribute_acc_modifer="public"/> 
 <attribute attribute_type= "int"  attribute_name= "age"  attribute_acc_modifer="public"/> 
</attributes>

<constructors>
    <constructor con_acc_modifer="public" con_name="Student">

            <para para_type="String" para_name="studentName"/>
            <para para_type="int" para_name="age"/>
    </constructor>

    <constructor con_acc_modifer="public" con_name="Student">

            <para para_type="String" para_name="studentName"/>
            <para para_type="int" para_name="age"/>

    </constructor>
</constructors>
</Class> 

</Content>

Y este es mi archivo de plantilla:

## class .vm 
##apachi-3

import java.util.*; 

$class.acc_modif class $class.name { 

#foreach ( $att in $class.attributes ) 
   $att.attribute_acc_modifer $att.attribute_type $att.attribute_name; 
#end

#foreach ( $con in $class.constructors ) 
   $con.con_acc_modifer $con.con_name ( $con.para_type $con.para_name ) { ## Not working :(
}       
#end 
}

Y la salida fue así:

import java.util.*; 

public class Customer { 

public String studentName; 
public int age; 

public Student ( $con.para_type $con.para_name ) {   }       
public Student ( $con.para_type $con.para_name ) {   }       

}

Los estudiantes constructores no están trabajando. Creo que necesito usar otro bucle dentro de los corchetes en lugar de "$con.para_tipo $con.para_nombre" Pero no sé cómo usar otro bucle aquí (soy un novato de Apache Velocity).
¡Gurús de la velocidad, por favor, ayúdenme!

preguntado el 01 de julio de 12 a las 14:07

1 Respuestas

Mira como tienes un <constructors> etiqueta con <constructor> niños debajo?

Tu necesitas un <paras> padre para su <para> niños. Lo pasarás mal sin él.

Una vez que tengas eso, simplemente repite el truco que ya has realizado.

Me pregunto por qué necesita esto cuando JAXB es parte de JDK. También me pregunto por qué simplemente escribir la clase sería algo tan difícil de hacer. ¿Es este uno de esos casos en los que decide que una solución "automatizada" sería mejor, pero luego el tiempo que lleva descubrir cómo hacerlo supera con creces lo que habría gastado si simplemente se hubiera sentado y comenzado a escribir? ?

<?xml version= "1.0" encoding= "UTF-8" ?> 
<Content> 
<Class name= "Customer"  acc_modif="public"> 
<attributes>
 <attribute attribute_type= "String" attribute_name= "studentName"  attribute_acc_modifer="public"/> 
 <attribute attribute_type= "int"  attribute_name= "age"  attribute_acc_modifer="public"/> 
</attributes>

<constructors>
    <constructor con_acc_modifer="public" con_name="Student">
        <parameters>
            <para para_type="String" para_name="studentName"/>
            <para para_type="int" para_name="age"/>
        </parameters>
    </constructor>

    <constructor con_acc_modifer="public" con_name="Student">
        <parameters>
            <para para_type="String" para_name="studentName"/>
            <para para_type="int" para_name="age"/>
        </parameters>
    </constructor>
</constructors>
</Class> 

</Content>

Diría que su uso de mayúsculas y minúsculas es inconsistente. Elige uno y quédate con él.

Y tu plantilla:

## class .vm 
##apachi-3

import java.util.*; 

$class.acc_modif class $class.name { 

#foreach ( $att in $class.attributes ) 
   $att.attribute_acc_modifer $att.attribute_type $att.attribute_name; 
#end

#foreach ( $con in $class.constructors ) 
   $con.con_acc_modifer $con.con_name ( 
   #foreach ($parameter in $parameters) # Not 100% sure of notation; I'll leave that for you
       $con.para_type, $con.para_name
   #end  
   ) {
}       
#end 
}

Respondido 01 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.