代码生成 - XML到Java

时间:2011-02-15 16:04:01

标签: java xml xsd code-generation

我正在寻找一种从XML生成动态(手段,每次其他java类)Java类的方法。初始XML基于XSD,但结果类应该是bean。 例如:

XSD(就在不久):

Configuration->configuration-item->name
                                  ->value
                                  ->type
                                  ->scope
              ->impl-class-info

基本上是一个带有实现类名称和配置项列表

的简单参数

XML(示例):

<configuration>
 <impl-class-info>desired.class.name.APPConfig</impl-class-info>
 <configuration-item>
   <name>ipOfSomeServer</name>
   <type>string</type>
   <value>8.8.8.8</value>
   <scope></scope>
 </configuration-item>

 <configuration-item>
   <name>portOfSomeServer</name>
   <type>string</type>
   <value>1099</value>
   <scope></scope>
 </configuration-item>
</configuration>

生成的java类应该是这样的:

package desired.class.name;

import xxx.xxx.xxx.ConfigurationElement;

public class APPConfig extends ConfigurationElement {

private String ipOfSomeServer;
private String portOfSomeServer;

public void setIpOfSomeServer(String ipOfSomeServer){
   this.ipOfSomeServer = ipOfSomeServer;
}
public void setPortOfSomeServer(String portOfSomeServer){
   this.portOfSomeServer = portOfSomeServer;
}

public String getPortOfSomeServer(){
   return this.portOfSomeServer;
}

public String getIpOfSomeServer(){
   return this.ipOfSomeServer;
}

怎么做?我迷路了。我在JAXB,XStream,XMLBeans上看了(可能不够好),但它似乎不是我需要的。

“复杂输入XML”可能由XSLT(我认为)转换为简单的

<desired.class.name.APPConfig>
 <ipOfSomeServer>8.8.8.8</ipOfSomeServer>
 <portOfSomeServer>1099</portOfSomeServer>
</desired.class.name.APPConfig>

但是呢?

提前致谢 亚历

P.S。在尝试了一些技术后,我采取了一项挑战,使用XSLT将XML转换为Text(语法上为Java类)。之前使用maven和定义的XSD进行的XML验证 感谢大家的帮助。

5 个答案:

答案 0 :(得分:1)

您可以从解析XML开始(使用许多可用的解析器之一,比如XPath)并相应地生成代码。

您可以使用一个非常好的Java代码解析器/生成器,名为Javaparser。该名称有点误导,因为它可以用于从头开始创建新的编译单元。

一个例子:

 /**
     * creates the compilation unit
     */
    private static CompilationUnit createCU() {
        CompilationUnit cu = new CompilationUnit();
        // set the package
        cu.setPakage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));

        // create the type declaration 
        ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
        ASTHelper.addTypeDeclaration(cu, type);

        // create a method
        MethodDeclaration method = new MethodDeclaration(ModifierSet.PUBLIC, ASTHelper.VOID_TYPE, "main");
        method.setModifiers(ModifierSet.addModifier(method.getModifiers(), ModifierSet.STATIC));
        ASTHelper.addMember(type, method);

        // add a parameter to the method
        Parameter param = ASTHelper.createParameter(ASTHelper.createReferenceType("String", 0), "args");
        param.setVarArgs(true);
        ASTHelper.addParameter(method, param);

        // add a body to the method
        BlockStmt block = new BlockStmt();
        method.setBody(block);

        // add a statement do the method body
        NameExpr clazz = new NameExpr("System");
        FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
        MethodCallExpr call = new MethodCallExpr(field, "println");
        ASTHelper.addArgument(call, new StringLiteralExpr("Hello World!"));
        ASTHelper.addStmt(block, call);

        return cu;
    }

答案 1 :(得分:1)

当我以前编写代码生成器时,我所做的就是首先创建一个中间步骤 - 我想要生成代码的各种事物的模型。然后,您有两个步骤:

  1. 使用您喜欢的XML解析库将XML解析到模型中
  2. 使用模板引擎(Velocity是我的偏好)从模型生成代码。
  3. 这很好,因为它更容易测试,如果您决定更换易于阅读的DSL的XML,则更改会更容易。

答案 2 :(得分:0)

你误解了XSLT在这种情况下的作用。

XSLT可用于将一个XML文档转换为另一个XML文档,也可用于将一个XML文档转换为另一个非XML文档。您想要创建一个XSLT,它将您的“源XML”转换为Java代码。

Here is an example of an XSL transform which converts XML to CSV。希望它能让您深入了解如何将XML转换为非XML输出。

顺便说一句,你会很快发现XML对大多数编程语言都是一个糟糕的包装器。

答案 3 :(得分:0)

我不知道有什么神奇的工具可以做到这一点,但是如果你准备好实际写一些代码,那么我认为你可以:

  • 解决一些问题来解析XML(使用内置的XPath / DOM API相当容易)并吐出相应的Java源代码
  • 使用Java Compiler API编译它

答案 4 :(得分:0)

我相信JiBX suite中的一个工具可以完成这项工作。我想没有人意味着它们可以在运行时使用,可能只有一次,但我仍然没有看到任何阻止你将它嵌入运行时代码的东西。

顺便说一下,我不太理解你为什么要在运行时生成一个类。如果在运行时生成一个类,那么它与普通Map<String,Object>属性映射有什么不同(或者它与之相比会带来什么价值)?