我创建了一个库,其中包含从现有的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。这使我无法成功尝试此操作;我只能将现有代码重构到没有语法和编译器错误的程度。