1

JAXB を使用して、いくつかの xsd ファイルに基づいて Java クラスを生成しようとしています。自分では解決できない問題にぶつかります。xsd ファイルを変更できないことを強調したいだけです。だから、これは私が持っている問題です: MultiDestScheduleRQ と MultiDestScheduleRS の 2 つの xsd ファイルがあり、どちらも同様の構造を持っています:

<xs:attributeGroup name="ResponseGroup">
    <xs:annotation>
        <xs:documentation source="Description" xml:lang="en">BLA</xs:documentation>
    </xs:annotation>
    <xs:attribute name="MoreIndicator" type="xs:boolean" use="optional">
        <xs:annotation>
                <xs:documentation source="Description" xml:lang="en">BLA BLA</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attribute name="MoreDataEchoToken" type="StringLength1to128" use="optional">
        <xs:annotation>
            <xs:documentation source="Description" xml:lang="en">BLA BLA BLA.</xs:documentation>
        </xs:annotation>
    </xs:attribute>
</xs:attributeGroup>
<xs:element name="MultiDestScheduleRQ">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="QueryType">
                <xs:sequence>
                    <xs:element name="Journeys">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="Journey" maxOccurs="12">
                                    <xs:complexType>                                    
                                        <xs:attribute name="RPH" type="Type" use="required">
                                            <xs:annotation>
                                                <xs:documentation>BLA</xs:documentation>
                                            </xs:annotation>
                                        </xs:attribute>
                                        <xs:attributeGroup ref="ResponseGroup"/>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

MultiDestScheduleRS の唯一の違いは、要素の名前です。Java クラスを生成しようとすると、エラーが発生します。

org.xml.sax.SAXParseException: 'ResponseGroup' is already defined

カスタムバインディングで修正しようとしました:

<jxb:bindings schemaLocation="./../Validated/MultiDestScheduleRQ.xsd" >
  <jxb:bindings node="//xs:attributeGroup[@name='ResponseGroup']//xs:attributeGroup">
    <jxb:property name="ResponseGroupRQ"/>
  </jxb:bindings>
</jxb:bindings>

しかし、それはエラーメッセージを変更しただけです

com.sun.istack.SAXParseException2: XPath evaluation of "//xs:attributeGroup[@name='ResponseGroup']//xs:attributeGroup" results in empty target node 

私も試しました

<jxb:bindings schemaLocation="./../Validated/MultiDestScheduleRQ.xsd" >
      <jxb:bindings node="//xs:attributeGroup[@name='ResponseGroup']">
        <jxb:property name="ResponseGroupRQ"/>
      </jxb:bindings>
    </jxb:bindings>

最初のエラーが再び発生するだけです (「ResponseGroup」が既に定義されているというエラー)。

誰でも助けてもらえますか?

更新 Mavenプラグインを使用してクラスを生成します。これはpomのフラグメントです

<plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.7.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <verbose>true</verbose>
                <schemaDirectory>./src/main/xsd</schemaDirectory>
                <schemaIncludes>
                  <include>**/*/*.xsd</include>

                </schemaIncludes>

                <bindingDirectory>./src/main/xsd/541_Grammar_Multidest/xjb</bindingDirectory>
                <bindingIncludes>
                  <include>binding.xml</include>
                </bindingIncludes>

                <generatePackage>com.my.package</generatePackage>
                <extension>true</extension>
                <staleFile>${project.build.directory}/jaxb2/.schema2XjcStaleFlag</staleFile>
            </configuration>
        </plugin>
4

1 に答える 1

1

投稿した XML スキーマ フラグメントから、エラーの原因を特定するのは困難です。私はそれを少し洗い流し、そこからクラス生成を成功させました:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema" xmlns="http://www.example.org/schema"
    elementFormDefault="qualified">

    <xs:attributeGroup name="ResponseGroup">
        <xs:annotation>
            <xs:documentation source="Description" xml:lang="en">BLA
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="MoreIndicator" type="xs:boolean" use="optional">
            <xs:annotation>
                <xs:documentation source="Description" xml:lang="en">BLA
                    BLA
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="MoreDataEchoToken" type="StringLength1to128"
            use="optional">
            <xs:annotation>
                <xs:documentation source="Description" xml:lang="en">BLA
                    BLA BLA.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:attributeGroup>
    <xs:element name="MultiDestScheduleRQ">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="QueryType">
                    <xs:sequence>
                        <xs:element name="Journeys">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Journey" maxOccurs="12">
                                        <xs:complexType>
                                            <xs:attribute name="RPH" type="Type" use="required">
                                                <xs:annotation>
                                                    <xs:documentation>BLA</xs:documentation>
                                                </xs:annotation>
                                            </xs:attribute>
                                            <xs:attributeGroup ref="ResponseGroup" />
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="StringLength1to128">
        <xs:restriction base="xs:string" />
    </xs:simpleType>

    <xs:complexType name="QueryType" />

    <xs:simpleType name="Type">
        <xs:restriction base="xs:string" />
    </xs:simpleType>

</xs:schema>

JAXB 実装は属性グループのプロパティを生成しないため、定義したバインディング ファイルは機能しません。以下に、属性グループがどのように扱われるかを示す小さな例を示します。

XML スキーマ

以下は、同じ属性グループを参照する 2 つの複合型を持つ XML スキーマのサンプルです。

スキーマ.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <attributeGroup name="my-attribute-group">
        <attribute name="att1" type="string"/>
        <attribute name="att2" type="int"/>
    </attributeGroup>

    <complexType name="foo">
        <attributeGroup ref="tns:my-attribute-group"/>
        <attribute name="foo-att" type="string"/>
    </complexType>

    <complexType name="bar">
        <attributeGroup ref="tns:my-attribute-group"/>
        <attribute name="bar-att" type="string"/>
    </complexType>

</schema>

生成されたモデル

以下の生成されたクラスでは、属性グループの属性が、複合型内で定義された属性と同じように扱われていることがわかります。

フー

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo")
public class Foo {

    @XmlAttribute(name = "foo-att")
    protected String fooAtt;
    @XmlAttribute(name = "att1")
    protected String att1;
    @XmlAttribute(name = "att2")
    protected Integer att2;

}

バー

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bar")
public class Bar {

    @XmlAttribute(name = "bar-att")
    protected String barAtt;
    @XmlAttribute(name = "att1")
    protected String att1;
    @XmlAttribute(name = "att2")
    protected Integer att2;

}
于 2013-07-30T13:47:40.990 に答える