繁体   English   中英

使用XJC或xmlBeans生成代理类失败

[英]Generating proxy classes using XJC or xmlBeans fails

我正在尝试使用XJC 2.2.4-2和情节文件生成代理类。 最初的情节生成使用amazon.xsd效果很好,但是随后的使用情节的请求均失败。

我也尝试了xmlbeans scomp命令,该命令也失败了。

我正在运行的命令是:

xjc.exe -extension -b amazon.episode amzn-base.xsdscomp -src amazonGeneratedClasses -out feedsApi.jar new new是包含所有xsd文件的目录。

哪个输出:

[XJC]

parsing a schema...
[ERROR] SCD "AmazonOnly" didnt match any schema component
  line 69 of file:/C:/Users/roberth/Programming_Projects/new/amazon.episode

[ERROR] SCD "Amazon-Vendor-Only" didnt match any schema component
  line 60 of file:/C:/Users/roberth/Programming_Projects/new/amazon.episode

Failed to parse a schema.

60行:

 <jaxb:bindings scd="Amazon-Vendor-Only">
      <jaxb:class ref="amazon.AmazonVendorOnly"/>
    </jaxb:bindings>

第69行:

  <jaxb:bindings scd="Amazon-Only">
      <jaxb:class ref="amazon.AmazonOnly"/>
    </jaxb:bindings>

文件amazon.AmazonVendorOnly和amazon.AmazonOnly确实存在。

[XmlBeans]

MerchantListingsReport.xsd:27:8: error: Invalid QName value: Can't resolve prefix 'tns'
amzn-header.xsd:17:5: error: sch-props-correct.2: Duplicate global element: Header (Original global element found in file: aces.xsd)
AmazonACES.xsd:109:2: error: sch-props-correct.2: Duplicate global element: Aspiration (Original global element found in file: aces.xsd)
AmazonACES.xsd:118:2: error: sch-props-correct.2: Duplicate global element: BaseVehicle (Original global element found in file: aces.xsd)
AmazonACES.xsd:127:2: error: sch-props-correct.2: Duplicate global element: BedLength (Original global element found in file: aces.xsd)
AmazonACES.xsd:136:2: error: sch-props-correct.2: Duplicate global element: BedType (Original global element found in file: aces.xsd)
AmazonACES.xsd:145:2: error: sch-props-correct.2: Duplicate global element: BodyNumDoors (Original global element found in file: aces.xsd)
AmazonACES.xsd:154:2: error: sch-props-correct.2: Duplicate global element: BodyType (Original global element found in file: aces.xsd)
AmazonACES.xsd:163:2: error: sch-props-correct.2: Duplicate global element: BrakeABS (Original global element found in file: aces.xsd)
AmazonACES.xsd:172:2: error: sch-props-correct.2: Duplicate global element: BrakeSystem (Original global element found in file: aces.xsd)
AmazonACES.xsd:181:2: error: sch-props-correct.2: Duplicate global element: CylinderHeadType (Original global element found in file: aces.xsd)
AmazonACES.xsd:190:2: error: sch-props-correct.2: Duplicate global element: DisplayOrder (Original global element found in file: aces.xsd)
AmazonACES.xsd:191:2: error: sch-props-correct.2: Duplicate global element: DriveType (Original global element found in file: aces.xsd)
AmazonACES.xsd:200:2: error: sch-props-correct.2: Duplicate global element: EngineBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:209:2: error: sch-props-correct.2: Duplicate global element: EngineDesignation (Original global element found in file: aces.xsd)
AmazonACES.xsd:218:2: error: sch-props-correct.2: Duplicate global element: EngineMfr (Original global element found in file: aces.xsd)
AmazonACES.xsd:227:2: error: sch-props-correct.2: Duplicate global element: EngineVIN (Original global element found in file: aces.xsd)
AmazonACES.xsd:236:2: error: sch-props-correct.2: Duplicate global element: EngineVersion (Original global element found in file: aces.xsd)
AmazonACES.xsd:252:2: error: sch-props-correct.2: Duplicate global element: FrontBrakeType (Original global element found in file: aces.xsd)
AmazonACES.xsd:261:2: error: sch-props-correct.2: Duplicate global element: FrontSpringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:270:2: error: sch-props-correct.2: Duplicate global element: FuelDeliverySubType (Original global element found in file: aces.xsd)
AmazonACES.xsd:279:2: error: sch-props-correct.2: Duplicate global element: FuelDeliveryType (Original global element found in file: aces.xsd)
AmazonACES.xsd:288:2: error: sch-props-correct.2: Duplicate global element: FuelSystemControlType (Original global element found in file: aces.xsd)
AmazonACES.xsd:297:2: error: sch-props-correct.2: Duplicate global element: FuelSystemDesign (Original global element found in file: aces.xsd)
AmazonACES.xsd:306:2: error: sch-props-correct.2: Duplicate global element: FuelType (Original global element found in file: aces.xsd)
AmazonACES.xsd:323:2: error: sch-props-correct.2: Duplicate global element: IgnitionSystemType (Original global element found in file: aces.xsd)
AmazonACES.xsd:332:2: error: sch-props-correct.2: Duplicate global element: Make (Original global element found in file: aces.xsd)
AmazonACES.xsd:341:2: error: sch-props-correct.2: Duplicate global element: MfrBodyCode (Original global element found in file: aces.xsd)
AmazonACES.xsd:351:2: error: sch-props-correct.2: Duplicate global element: MfrLabel (Original global element found in file: aces.xsd)
AmazonACES.xsd:360:2: error: sch-props-correct.2: Duplicate global element: Model (Original global element found in file: aces.xsd)
AmazonACES.xsd:369:2: error: sch-props-correct.2: Duplicate global element: Note (Original global element found in file: aces.xsd)
AmazonACES.xsd:387:2: error: sch-props-correct.2: Duplicate global element: Part (Original global element found in file: aces.xsd)
AmazonACES.xsd:396:2: error: sch-props-correct.2: Duplicate global element: PartType (Original global element found in file: aces.xsd)
AmazonACES.xsd:405:2: error: sch-props-correct.2: Duplicate global element: Position (Original global element found in file: aces.xsd)
AmazonACES.xsd:414:2: error: sch-props-correct.2: Duplicate global element: Qty (Original global element found in file: aces.xsd)
AmazonACES.xsd:415:2: error: sch-props-correct.2: Duplicate global element: RearBrakeType (Original global element found in file: aces.xsd)
AmazonACES.xsd:424:2: error: sch-props-correct.2: Duplicate global element: RearSpringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:433:2: error: sch-props-correct.2: Duplicate global element: Region (Original global element found in file: aces.xsd)
AmazonACES.xsd:451:2: error: sch-props-correct.2: Duplicate global element: SteeringSystem (Original global element found in file: aces.xsd)
AmazonACES.xsd:460:2: error: sch-props-correct.2: Duplicate global element: SteeringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:469:2: error: sch-props-correct.2: Duplicate global element: SubModel (Original global element found in file: aces.xsd)
AmazonACES.xsd:508:2: error: sch-props-correct.2: Duplicate global element: TransmissionBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:517:2: error: sch-props-correct.2: Duplicate global element: TransmissionControlType (Original global element found in file: aces.xsd)
AmazonACES.xsd:526:2: error: sch-props-correct.2: Duplicate global element: TransmissionMfr (Original global element found in file: aces.xsd)
AmazonACES.xsd:535:2: error: sch-props-correct.2: Duplicate global element: TransmissionMfrCode (Original global element found in file: aces.xsd)
AmazonACES.xsd:544:2: error: sch-props-correct.2: Duplicate global element: TransmissionNumSpeeds (Original global element found in file: aces.xsd)
AmazonACES.xsd:553:2: error: sch-props-correct.2: Duplicate global element: TransmissionType (Original global element found in file: aces.xsd)
AmazonACES.xsd:562:2: error: sch-props-correct.2: Duplicate global element: VehicleType (Original global element found in file: aces.xsd)
AmazonACES.xsd:571:2: error: sch-props-correct.2: Duplicate global element: WheelBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:580:2: error: sch-props-correct.2: Duplicate global element: Years (Original global element found in file: aces.xsd)
PIES_5.0_02_01_2006.xsd:4548:2: error: sch-props-correct.2: Duplicate global type: MaintenanceType (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4591:2: error: sch-props-correct.2: Duplicate global type: ImageStyle (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4664:2: error: sch-props-correct.2: Duplicate global type: FileType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4706:2: error: sch-props-correct.2: Duplicate global type: ImageResolution (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4756:2: error: sch-props-correct.2: Duplicate global type: ImageRepresentation (Original global type found in file: AmazonPIES
.xsd)
PIES_5.0_02_01_2006.xsd:4799:2: error: sch-props-correct.2: Duplicate global type: ColorMode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4846:2: error: sch-props-correct.2: Duplicate global type: Background (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4894:2: error: sch-props-correct.2: Duplicate global type: OrientationView (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4977:2: error: sch-props-correct.2: Duplicate global type: ImageFileEncodeType (Original global type found in file: AmazonPIES
.xsd)
PIES_5.0_02_01_2006.xsd:5065:2: error: sch-props-correct.2: Duplicate global type: LanguageCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5113:2: error: sch-props-correct.2: Duplicate global type: LinkCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5215:2: error: sch-props-correct.2: Duplicate global type: ItemIDQualifier (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:5270:2: error: sch-props-correct.2: Duplicate global type: KitsUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5384:2: error: sch-props-correct.2: Duplicate global type: PackageUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5432:2: error: sch-props-correct.2: Duplicate global type: PackageDimUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5475:2: error: sch-props-correct.2: Duplicate global type: ShippingScope (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5518:2: error: sch-props-correct.2: Duplicate global type: Bulk (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5561:2: error: sch-props-correct.2: Duplicate global type: WeightUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5604:2: error: sch-props-correct.2: Duplicate global type: CountryCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6121:2: error: sch-props-correct.2: Duplicate global type: TransportMethod (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:6168:2: error: sch-props-correct.2: Duplicate global type: Regulated (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6212:2: error: sch-props-correct.2: Duplicate global type: PackagingGroupCode (Original global type found in file: AmazonPIES.
xsd)
PIES_5.0_02_01_2006.xsd:6258:2: error: sch-props-correct.2: Duplicate global type: ExtendedProductInformationCode (Original global type found in file:
 AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6417:2: error: sch-props-correct.2: Duplicate global type: RegulationsExceptionCode (Original global type found in file: Amazo
nPIES.xsd)
PIES_5.0_02_01_2006.xsd:6466:2: error: sch-props-correct.2: Duplicate global type: PriceBreakUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6545:2: error: sch-props-correct.2: Duplicate global type: PriceUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6681:2: error: sch-props-correct.2: Duplicate global type: DescriptionCode (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:6748:2: error: sch-props-correct.2: Duplicate global type: PriceType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6865:2: error: sch-props-correct.2: Duplicate global type: OQUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6974:2: error: sch-props-correct.2: Duplicate global type: GTINQualifier (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7025:2: error: sch-props-correct.2: Duplicate global type: HazardousMaterialCode (Original global type found in file: AmazonPI
ES.xsd)
PIES_5.0_02_01_2006.xsd:7070:2: error: sch-props-correct.2: Duplicate global type: StateCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7247:2: error: sch-props-correct.2: Duplicate global type: ContactType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7290:2: error: sch-props-correct.2: Duplicate global type: QualityGradeLevel (Original global type found in file: AmazonPIES.x
sd)
PIES_5.0_02_01_2006.xsd:13:2: error: sch-props-correct.2: Duplicate global element: PartInformation (Original global element found in file: AmazonPIES
.xsd)
TypeDefinitions.xsd:36:2: error: sch-props-correct.2: Duplicate global type: CurrencyCode (Original global type found in file: PIES_5.0_02_01_2006.xsd
)
Time to build schema type system: 3.525 seconds
BUILD FAILED

不幸的是,XSD文件都标记为机密,因此我无法在此处共享它们的内容。 话虽这么说,如果任何人有任何预感,建议甚至方向,请分享。

这可能是(也可能不是)答案,因为我不知道您的设置的确切细节,但是问题强烈地使我想起了这一点,因此我认为这可能会有所帮助。 请注意,这仅适用于使用XJC的JAXB。 但是,此问题的根源实际上可能是Apache Xerces和/或其等效JRE中的错误,因此,对绑定框架的选择可能不会有所作为。 JRE Xerces fork和最新的Xerces版本都存在问题,因此切换XML API实现对我也没有任何作用。

我有一个Maven项目,它非常简单地包含一个主模式,该主模式包含的其他一些模式(相同的名称空间)和一个绑定文件。 然后,我有许多其他的Maven项目,每个项目都有其自己的导入主要项目的模式(不同的名称空间)。 由于主模式及其包含的JAXB实体已经由第一个Maven项目生成,因此我也希望使用情节文件来确保其他项目会简单地扩展它,而不是重新生成代码。 这将允许我分发单独的罐子。

这是第一个主要项目的Maven pom(Maven 3):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme.xml</groupId>
    <artifactId>acme-xml-main</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>Acme XML main models</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <outputDirectory>${basedir}/target/classes-${compilerTarget}</outputDirectory>
        <testOutputDirectory>${basedir}/target/test-classes-${compilerTarget}</testOutputDirectory>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <!-- Filtering out any svn folders -->
                    <exclude>**/.svn</exclude>
                    <!-- Filtering out JAXB binding files -->
                    <exclude>**/*.xjb</exclude>
                    <!-- Filtering out XML catalogs -->
                    <exclude>**/*.cat</exclude>
                </excludes>
            </resource>
        </resources>
        <!-- First we need to generate Java source files based on the schemas -->
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb21-plugin</artifactId>
                <version>0.8.0</version>
                <executions>
                    <execution>
                        <id>xjc-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaDirectory>${basedir}/src/main/resources/acme/schemas</schemaDirectory>
                            <schemaLanguage>XMLSCHEMA</schemaLanguage>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <episode>true</episode>
                            <removeOldOutput>true</removeOldOutput>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <optimize>true</optimize>
                 <source>1.6</source>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>
</project>

这些模式与XJC生成的类一起打包。 我想在“扩展”该项目的其他项目中引用该项目(或更具体地说,它的jar)。

这是其中一种扩展的Maven pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme.xml</groupId>
    <artifactId>acme-xml-sub</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>Acme XML sub models</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>acme.xml</groupId>
            <artifactId>acme-xml-main</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <outputDirectory>${basedir}/target/classes-${compilerTarget}</outputDirectory>
        <testOutputDirectory>${basedir}/target/test-classes-${compilerTarget}</testOutputDirectory>
        <!-- Resources to include into the packaged build -->
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <!-- Filtering out any svn folders -->
                    <exclude>**/.svn</exclude>
                    <!-- Filtering out JAXB binding files -->
                    <exclude>**/*.xjb</exclude>
                    <!-- Filtering out XML catalogs -->
                    <exclude>**/*.cat</exclude>
                </excludes>
            </resource>
        </resources>
        <plugins>
            <!-- First we need to generate Java source files based on the schemas -->
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb21-plugin</artifactId>
                <version>0.8.2</version>
                <executions>
                    <execution>
                        <id>xjc-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <!-- The extension flag needs to be on in order to use the episode file -->
                            <args>
                                <arg>-extension</arg>
                            </args>
                            <schemaDirectory>${basedir}/src/main/resources/acme/sub/schemas</schemaDirectory>
                            <schemaLanguage>XMLSCHEMA</schemaLanguage>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <!-- No need to generate an episode for this compilation... -->
                            <episode>false</episode>
                            <!-- The catalog makes sure we can resolve the main schema -->
                            <catalog>${basedir}/src/main/resources/acme/sub/schemas/catalog.cat</catalog>
                            <!-- Using the episode file from the main model jar -->
                            <episodes>
                                <episode>
                                    <groupId>acme.xml</groupId>
                                    <artifactId>acme-xml-main</artifactId>
                                    <version>1.0.0</version>
                                    <scope>compile</scope>
                                </episode>
                            </episodes>
                            <removeOldOutput>true</removeOldOutput>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <optimize>true</optimize>
                    <excludes>
                        <!-- This exclude avoids compiling the ObjectFactory class that -->
                        <!-- XJC insists on generating for the default package name of the main -->
                        <!-- namespace. Please leave this in to avoid any trouble. -->
                        <exclude>**/acme/main/ObjectFactory.java</exclude>
                    </excludes>
                 <source>1.6</source>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>
</project>

我遇到的第一个问题是找不到用于导入子模式的主模式。 让我们将主模式main.xsd ,假设它具有目标名称空间http://www.acme.com ,并且其JAXB类由绑定文件放置在acme.main包中。

对于解析模式,可以使用目录。 所以这是我尝试的第一件事。 在子项目中,我添加了带有以下内容的catalog.cat文件:

--
  Resolving the main XML Schema system ID.
--
SYSTEM "main.xsd" "classpath:/acme/schemas/main.xsd"

--
  Resolving the main namespace to the corresponding schema file.
--
PUBLIC "http://www.acme.com" "classpath:/acme/schemas/main.xsd"

您可以看到上面第二个Maven pom中引用的catalog.cat。 我尝试了许多不同的方法来获取SYSTEM ID,但是不管我做了什么,在类路径上解析模式似乎都行不通。 因此,我转向创建一个可以为我自己处理的自定义目录解析器。 这是我与主要模式/ JAXB模型jar文件打包在一起的Java类。 我将此依赖项添加到了第一个Maven pom中...

<dependency>
    <groupId>com.sun.org.apache.xml.internal</groupId>
    <artifactId>resolver</artifactId>
    <version>20050927</version>
    <scope>provided</scope>
</dependency>

...,并创建了一个自定义目录解析器,该解析器始终将某些系统ID和主名称空间URI链接到我的主架构。

然后,我将第二个Maven pom的XJC生成配置调整为:

<!-- First we need to generate Java source files based on the schemas -->
<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb21-plugin</artifactId>
    <version>0.8.2</version>
    <!-- Need this dependency for the custom catalog resolver -->
    <dependencies>
        <dependency>
            <groupId>acme.xml</groupId>
            <artifactId>acme-xml-main</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>xjc-generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <!-- The extension flag needs to be on in order to use the episode file -->
                <args>
                    <arg>-extension</arg>
                </args>
                <schemaDirectory>${basedir}/src/main/resources/acme/sub/schemas</schemaDirectory>
                <schemaLanguage>XMLSCHEMA</schemaLanguage>
                <addCompileSourceRoot>true</addCompileSourceRoot>
                <!-- No need to generate an episode for this compilation... -->
                <episode>false</episode>
                <!-- The catalog makes sure we can resolve the main schema -->
                <catalog>${basedir}/src/main/resources/acme/sub/schemas/catalog.cat</catalog>
                <catalogResolver>acme.xml.tools.AcmeCatalogResolver</catalogResolver>
                <!-- Using the episode file from the general model bundle -->
                <episodes>
                    <episode>
                        <groupId>acme.xml</groupId>
                        <artifactId>acme-xml-main</artifactId>
                        <version>1.0.0</version>
                        <scope>compile</scope>
                    </episode>
                </episodes>
                <removeOldOutput>true</removeOldOutput>
            </configuration>
        </execution>
    </executions>
</plugin>

有了这个,以及目录解析器的一些控制台输出来找出正在发生的事情,最终可以从类路径中解析主模式。 但是事情还没有准备好。

每当我在主模式中使用include时,为确保清晰起见,可以确保将其分解为不同的文件和组定义,我会发现XML处理器抱怨重复的定义。 似乎可以通过不同的路径(某些系统ID,其他名称空间,某些完整路径,其他相对路径...)来解析各种文件,这似乎会引起问题。 尽管这些路径指向的是本质上相同的文件,但是XML处理器会将从其中加载的所有内容视为单独的定义。 似乎XML验证API并不擅长创建一个一致的Schema对象,而只是一直在寻找东西,而没有意识到它正在通过不同的路径查看同一文件。

因此,我在自定义目录解析器中添加了更多内容,以确保始终以相同方式访问包含的文件。 这是结果类:

package acme.xml.tools;

import com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.InputSource;

public class AcmeCatalogResolver extends CatalogResolver {

    private final static String namespace = "http://www.acme.com";
    private final static Set<String> systemIDs;
    static {
        final Set<String> temp = new HashSet<String>();
        temp.add("main.xsd");
        temp.add("Main.xsd");
        temp.add("MAIN.xsd");
        systemIDs = Collections.unmodifiableSet(temp);
    }

    @Override
    public InputSource resolveEntity(String publicId, String systemId) {

        //If the public ID is the main namespace, get the input source
        //based on the system ID
        if(publicId != null && publicId.trim().equals(namespace)) {
            final InputSource source = getInputSource(systemId);
            source.setPublicId(publicId);
            return source;
        }

        //Otherwise, check if the system ID is one of the allowed references
        //to the main schema and return that
        if(systemId != null && systemIDs.contains(systemId.trim())) {
            final InputSource source = getMainSchemaInputSource();
            source.setPublicId(publicId);
            return source;
        }

        //Still nothing: check for file or jar URIs to the main schema
        if(systemId != null && (systemId.startsWith("file:") || 
                systemId.startsWith("jar:"))) {
            boolean match = false;
            for(final String id : systemIDs) {
                match = systemId.endsWith(id);
                if(match)
                    break;
            }
            if(match) {
                final InputSource source = getMainSchemaInputSource();
                source.setPublicId(publicId);
                return source;
            }
        }

        //Final option: use only the system ID to find the source
        if(systemId != null && !systemId.isEmpty()) {
            final InputSource source = getInputSource(systemId);
            source.setPublicId(publicId);
            return source;
        }

        //This should not be necessary, but just in case...
        return super.resolveEntity(publicId, systemId);

    }

    @Override
    public Source resolve(String href, String base) throws TransformerException {

        if(href != null && href.trim().equals(namespace)) {
            final StreamSource source = getMainSchemaSource();
            source.setPublicId(href);
            return getMainSchemaSource();
        }

        return super.resolve(href, base);

    }

    @Override
    public String getResolvedEntity(String string, String string1) {

        return super.getResolvedEntity(string, string1);

    }

    private InputSource getInputSource(String systemId) {

        final int lastSlash = systemId.lastIndexOf('/');
        if(lastSlash >= 0)
            systemId = systemId.substring(lastSlash + 1);
        final int lastBackSlash = systemId.lastIndexOf('\\');
        if(lastBackSlash >= 0)
            systemId = systemId.substring(lastBackSlash + 1);

        final URL url = 
            this.getClass().getResource("/acme/schemas/" + systemId);

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/" + systemId);

        final InputSource source = new InputSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

    private InputSource getMainSchemaInputSource() {

        final URL url = 
            this.getClass().getResource("/acme/schemas/main.xsd");

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/main.xsd");

        final InputSource source = new InputSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

    private StreamSource getGeneralSchemaSource() {

        final URL url = 
            this.getClass().getResource("/acme/schemas/main.xsd");

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/main.xsd");

        final StreamSource source = new StreamSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

}

这样,我终于使它工作了。 我希望这可以在某种程度上为您提供解决方案的途径。

是的,它很脏。 我正在扩展Sun内部类。 我基本上只是在使用目录文件将对主架构或其名称空间的请求定向到一些对整个交易进行硬编码的hacky类。 但是至少它是这样工作的。 由于显然Sun不能竭力解决其JAXP实施中已经开放多年的问题! 而且我也不认为甲骨文会胡说八道。 但是,您最好确保他们会为任何敢于脱离主板的程序交互而试图将XML迫于您的喉咙。 Apache的Xerces实现也没有解决任何一个问题。 鉴于灾难就是W3C XML Schema规范,我并不是真的可以责怪他们。

抱歉,我只需要时不时地发泄一下,事实证明,用Java中的XML Schema进行琐碎的工作之外的任何事情都会立即变成精神折磨。 如果JAXB不是那么有用,我将不会对此感到困扰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM