有没有办法在JAXB中处理多个.xsd文件中的重复元素定义?
我有几十个和几十个.xsd
文件,我想自动生成代码。 当我尝试同时生成所有文件时,一些文件具有重复的名称。
我专注于尝试让其中的两个工作。
当我得到这两个工作时,我会解决剩下的问题。 但我现在只关注其中的两个文件。 我无法控制它们,它们来自供应商并遵循“标准” ,因此编辑它们不是出于多种原因的选择 。
我正在使用maven-jaxb2-plugin
来处理这些文件。
我添加了一个binding.xjb
文件,如mat b
的答案和我在网上找到的其他说明中的链接所示。 但我得到以下错误,没有输出。
出现以下错误
[ERROR] Error while parsing schema(s).Location [ file:/C:/Users/Jarrod%20Roberson/Projects/spa-tools/spa-lib/src/main/sc hema/mac-stylesheet-3.4.xsd{165,33}]. org.xml.sax.SAXParseException: 'halign' is already defined
令人不快的元素是:(还有很多其他的东西,这只是第一个发生冲突)
并且在每个.xsd
文件中都是相同的,如何使用仅生成一个类或者将每个类生成到其自己的包命名空间中来解决此重复问题?
这不是像这样的唯一重复元素,它们有很多,所以只是尝试从文件中删除它们也不是一个选项。
这个halign
是多个.xsd
文件,我想要将它们放在各自的包中,或者能够告诉编译器使用生成的第一个。
这是我在尝试外部.xjb
文件之前开始的地方,只需在pom.xml
指定package
。
如何配置绑定以忽略重复配置,将它们映射到单独的包或将它们映射到现有实现?
我有一个中途解决方案,但这是非常耗时的。 我必须为每个有重复条目的文件创建一个单独的
。
jaxb-mac generate-sources generate true my.company.mac src/main/schema mac-3.4.xsd jaxb-stylesheet generate-sources generate true my.company.stylesheet src/main/schema mac-stylesheet-3.4.xsd
很重要,或者只有第一个
会运行,其余的会认为不需要运行,因为我生成了同一个目录。
我仍然希望用较少的劳动密集型解决方案来处理重复项。
我想如果我把第一个主.xsd建立一个单独的模块构建到自己的.jar文件中,那么我可以使用
标签并让它跳过一遍又一遍地生成相同的重复元素,因为它们是相同的定义。
我已经决定尽可能放弃XML和完全放弃JAXB。 在编辑时,有更新更好的方法来解析XML并将其映射到对象。
意识到这是旧的,但我有同样的错误,可以通过不指定目标包 ,即xjc的-b选项来解决它。 然后,每个重复元素都在自己的命名空间包中创建,没有冲突。
将
元素添加到XSD:
资源
我发布我的gradle解决方案,它解决了重复的问题,并且不需要xjb文件:
task generateJaxb() { ext.sourcesDir = "${buildDir}/generated-sources/jaxb" ext.classesDir = "${buildDir}/classes/jaxb" ext.schemaDir = "src/resources/schemas" ext.tmp = "${buildDir}/tmp/xjc" doLast() { project.ant { taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: configurations.jaxb.asPath delete(dir: tmp) mkdir(dir: tmp) delete(dir: sourcesDir) delete(dir: classesDir) mkdir(dir: sourcesDir) mkdir(dir: classesDir) } fileTree(schemaDir){ include '**/*.xsd' include '**/*.wsdl' }.each{File file-> //println file project.ant { taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: configurations.jaxb.asPath xjc(destdir: tmp, schema:"${file.getAbsolutePath()}") { arg(value: "-wsdl") produces(dir: tmp, includes: "**/*.java") } copy(todir: sourcesDir) { fileset(dir: tmp, erroronmissingdir: false) { include(name: "**/*.java") } } delete(dir: tmp) mkdir(dir: tmp) } } project.ant { javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true, debugLevel: "lines,vars,source", classpath: configurations.jaxb.asPath) { src(path: sourcesDir) include(name: "**/*.java") include(name: "*.java") } copy(todir: classesDir) { fileset(dir: sourcesDir, erroronmissingdir: false) { exclude(name: "**/*.java") } } } } } configurations { jaxb } dependencies { jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1") compile(files(generateJaxb.classesDir).builtBy(generateJaxb)) } jar { from generateJaxb.classesDir }
我们遇到了类似的问题:我们在同一目录中有一个wsdl文件和两个xsd文件。 wsdl文件导入两个xsd文件。 问题是JAXB考虑了所有三个文件并抛出’……已定义’错误。 它基本上抱怨它在wsdl和xsd文件中都看到了相同的元素。
我们可以通过添加排除标记来修复maven插件配置(在pom.xml中)中的此问题,如下例所示:
org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.12.3 generate WSDL mywsdl.wsdl -XautoNameResolution *.xsd