我创建了一个库,其中包含从现有的XSD和JAXB生成的大约200个Java类,如下所示:

xjc -no-header -d schemas -b xsd/binding.xml xsd


Android,Android上不支持JAXB,一般建议是使用其他库。 Castor似乎是一个合适的选择-特别是因为它提供了将.xsd转换为Java类的功能。但是,这样做似乎比Java更复杂,而且我不知道结果与xjc输出有多少不同。

我的用例是拆封并读取拆封的数据(不需要更改数据或拆封)。就是说,有大量的代码依赖于生成的Java类模式,因此xjc生成的类与其Castor对应类之间的任何差异都将意味着大量的重构。

有没有关于如何从Castor中的.xsd生成Java类并获得与xjc产生的结果尽可能接近的结果的简单方法?

最佳答案

尽管仍然需要一些重构,但以下方法与我的方法差不多:

将一个名为castorbuilder.properties的文件放在您的类路径中,内容如下:

org.exolab.castor.builder.javaclassmapping=type
org.exolab.castor.builder.javaVersion=5.0
# Replace the following lines with your schema(s)
org.exolab.castor.builder.nspackages=\
   http://example.com/schema/foo=com.example.schema.foo,\
   http://example.org/schema/bar=org.example.schema.bar
org.exolab.castor.builder.primitivetowrapper=true


然后运行以下命令行:

java -cp "*" org.exolab.castor.builder.SourceGeneratorMain -i schema.xsd -types j2


在上面的代码中,将classpath替换为Castor JAR文件和castorbuilder.properties的路径,并将schema.xsd替换为XSD文件的路径。

当然,您可以通过Ant或Maven调用Castor,在这种情况下,请确保使用与上述命令行选项相同的选项,并确保拾取了属性文件。

需要重构的差异:


枚举类型现在位于其自己的types子包中
XML Enum文字位于camelCase中的位置,现在它们变为CAMELCASE而不是CAMEL_CASE
Castor生成数组属性,其中JAXB具有Collection属性
一些类名以下划线作为前缀。显然JAXB丢弃了那些,而Castor保留了它们
日期字段现在是Date实例
在一种情况下,属性将其名称从value更改为content


但是,在Castor中似乎有一个错误,如some of the generated classes invoke a non-existent constructor。这使我无法成功尝试此操作;我只能将现有代码重构到没有语法和编译器错误的程度。

09-07 22:29