如何在Apache Velocity中使用内部循环来解析XML

时间:2012-07-01 13:42:36

标签: java xml templates velocity

我将开发一个eclipse插件来生成简单的Java源代码。 最初我需要将XML文件转换为Java类代码。 我从互联网上找到了Apache Velocity,现在我正在玩一些简单的东西。 这是我的输入XML文件:

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

这是我的模板文件:

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

输出是这样的:

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 ) {   }       

}

学生建造者不工作。我想我需要在括号内使用另一个循环而不是“$ con.para_type $ con.para_name” 但我不知道如何在这里使用另一个循环(我是Apache Velocity的菜鸟) 速度大师请帮助我!

1 个答案:

答案 0 :(得分:2)

了解如何在其下面加<constructors><constructor>个孩子的标记?

您的<paras>孩子需要<para>个父母。如果没有它,你将度过难关。

一旦你有了这个,只需重复你已经完成的技巧。

我想知道为什么在JAXB是JDK的一部分时你需要这个。我也想知道为什么简单地写这个课程会很困难。这是你认为“自动化”解决方案会更好的情况之一,但是如果你只是坐下来开始打字,那么弄清楚如何做到这一点的时间大大超过你所花费的时间。 ?

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

我会说你对大小写的使用是不一致的。选择一个并坚持下去。

你的模板:

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