有没有办法在JAXB中处理多个.xsd文件中的重复元素定义?

23 java jaxb maven-plugin maven maven-jaxb2-plugin

我有几十个和几十个.xsd我想自动生成代码的文件.当我尝试同时生成所有文件时,一些文件具有重复的名称.

我专注于尝试让其中的两个工作.

当我得到这两个工作时,我会解决剩下的问题.但我现在只关注其中的两个文件.我无法控制它们,它们来自供应商并遵循"标准",因此编辑它们不是出于多种原因的选择.

我正在使用它maven-jaxb2-plugin来处理这些文件.

我添加了一个binding.xjb文件,如mat b我在网站上找到的答案和其他说明中的链接所示.但我得到以下错误,没有输出.

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.1"
              xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xsi:schemaLocation=" http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">
  <jxb:bindings schemaLocation="mac-3.4.xsd">
    <jxb:schemaBindings>
      <jxb:package name="my.company.mac"/>
    </jxb:schemaBindings>
  </jxb:bindings>
  <jxb:bindings schemaLocation="mac-stylesheet-3.4.xsd">
    <jxb:schemaBindings>
      <jxb:package name="my.company.stylesheet"/>
    </jxb:schemaBindings>
  </jxb:bindings>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)

出现以下错误

[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
Run Code Online (Sandbox Code Playgroud)

令人不快的元素是:(还有很多其他的只是第一个发生冲突的因素)

<xsd:simpleType name="halign">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="left" />
    <xsd:enumeration value="center" />
    <xsd:enumeration value="right" />
  </xsd:restriction>
</xsd:simpleType>
Run Code Online (Sandbox Code Playgroud)

并且在每个.xsd文件中都是相同的,如何使用仅生成一个类或者将每个类生成到其自己的包命名空间中来解决此重复问题?

这不是像这样的唯一重复元素,有很多,所以只是尝试从文件中删除它们也不是一个选项.

halign是在多个.xsd文件中,我想要将它们放在各自的包中,或者能够告诉编译器使用生成的第一个文件.

这是我在尝试外部.xjb文件之前开始的地方,只需在package中指定pom.xml.

如何配置绑定以忽略重复配置,将它们映射到单独的包或将它们映射到现有实现?

小智 11

我有一个中途解决方案,但这是非常耗时的.我必须<execution/>为每个具有重复条目的文件创建一个单独的文件.

<executions>
  <execution>
    <id>jaxb-mac</id>
    <phase>generate-sources</phase>
    <goals>
      <goal>generate</goal>
    </goals>
    <configuration>
      <forceRegenerate>true</forceRegenerate>
      <generatePackage>my.company.mac</generatePackage>
      <schemaDirectory>src/main/schema</schemaDirectory>
      <schemaIncludes>
        <include>mac-3.4.xsd</include>
      </schemaIncludes>
    </configuration>
  </execution>
  <execution>
    <id>jaxb-stylesheet</id>
    <phase>generate-sources</phase>
    <goals>
      <goal>generate</goal>
    </goals>
    <configuration>
      <forceRegenerate>true</forceRegenerate>
      <generatePackage>my.company.stylesheet</generatePackage>
      <schemaDirectory>src/main/schema</schemaDirectory>
      <schemaIncludes>
        <include>mac-stylesheet-3.4.xsd</include>
      </schemaIncludes>
    </configuration>
  </execution>
Run Code Online (Sandbox Code Playgroud)

<forceRegenerate>true</forceRegenerate>是重要的或者只有第一<execution/>将运行,其余的会认为没有必要运行,因为我生成到同一个目录.

我仍然希望用较少的劳动密集型解决方案来处理重复项.

我想如果我将第一个主.xsd构建为一个单独的模块,构建到自己的.jar文件中,那么我就可以使用该<episode/>标记并让它一遍又一遍地重复生成相同的重复元素,因为它们在定义上是相同的.

我已经决定尽可能放弃XML和完全放弃JAXB.在编辑时,有更新更好的方法来解析XML并将其映射到对象.


小智 5

意识到这是旧的,但我有同样的错误,它可以通过不指定目标包来解决它,即 xjc 的 -b 选项。然后每个重复的元素都在它们自己的命名空间包中创建并且没有冲突。

  • 评论强调这是*实际*答案,至少对我来说 - 在 pom 中删除我的 `maven-jaxb2-plugin` 配置中的 `&lt;generatePackage&gt;` 元素为我解决了同样的问题。 (2认同)