我正在寻找一种从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验证 感谢大家的帮助。
答案 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)
当我以前编写代码生成器时,我所做的就是首先创建一个中间步骤 - 我想要生成代码的各种事物的模型。然后,您有两个步骤:
这很好,因为它更容易测试,如果您决定更换易于阅读的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)
我不知道有什么神奇的工具可以做到这一点,但是如果你准备好实际写一些代码,那么我认为你可以:
答案 4 :(得分:0)
我相信JiBX suite中的一个工具可以完成这项工作。我想没有人意味着它们可以在运行时使用,可能只有一次,但我仍然没有看到任何阻止你将它嵌入运行时代码的东西。
顺便说一下,我不太理解你为什么要在运行时生成一个类。如果在运行时生成一个类,那么它与普通Map<String,Object>
属性映射有什么不同(或者它与之相比会带来什么价值)?