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

我有几十个文件,我想自动生成代码。有几个文件具有重复的名称,当我尝试同时生成所有这些文件时,它们会发生冲突。.xsd

我专注于尝试让其中2个工作。

当我让这2个工作时,我将修复其余部分。但我现在只关注其中的2个文件。我无法控制它们,它们来自供应商并遵循“标准”,因此出于多种原因,编辑它们不是一种选择

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

我按照在 中的链接添加了一个文件 答案和我在 Web 上找到的其他说明。但是我收到以下错误,没有输出。binding.xjbmat 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>

给出以下错误

[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:simpleType name="halign">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="left" />
    <xsd:enumeration value="center" />
    <xsd:enumeration value="right" />
  </xsd:restriction>
</xsd:simpleType>

并且每个文件中都是相同的,我如何解决这种重复,要么只生成一个类,要么每个类都生成到它们自己的包命名空间中?.xsd

这不是唯一像这样的重复元素,有很多,所以只是试图从文件中删除它们也不是一种选择。

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

这是我在尝试外部文件之前开始的地方,只需在..xjbpackagepom.xml

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


答案 1

我有一个半途而废的解决方法,但它非常耗时。我必须为每个具有重复条目的文件创建一个单独的文件。<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>

这很重要,或者只有第一个会运行,其余的会认为没有必要运行,因为我正在生成到同一个目录中。<forceRegenerate>true</forceRegenerate><execution/>

我仍然希望使用一个不那么劳动密集型的解决方案来处理重复项。

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

从那以后,我决定如果可能的话,完全放弃XML和JAXB。有更新和更好的方法来解析 XML 并将其映射到此编辑时的对象。


答案 2

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


推荐