用相同的元素重构xsd元素?

时间:2014-01-24 08:09:34

标签: java xml web-services jaxb xsd

我有以下xsd元素。

 <xsd:element name="requestOne" type="tns:RequestOne"/>
  <xsd:complexType name="RequestOne">
        <xsd:annotation>
            <xsd:documentation>some comment</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
  </xsd:complexType>

   <xsd:element name="requestTwo" type="tns:RequestTwo"/>
  <xsd:complexType name="RequestTwo">
        <xsd:annotation>
            <xsd:documentation>other comment</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
  </xsd:complexType>

它有两个复杂的元素,但在它们内部有重复的代码。我怎样才能重构上面的代码呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用ref来引用现有元素,而不是创建新元素,下面示例中的tns是指架构定义的名称空间

<xsd:element name="id" type="xsd:string"/>

...

<xsd:complexType name=RequestOne">
    <xsd:sequence>
        <xsd:element ref="tns:id" minOccurs="1" maxOccurs="1" />
    </xsd:sequence>
</xsd:complexType>

...

尽管如此,在这种简单的情况下,这并没有真正减少要写入的字符数。你甚至可以看看如何定义抽象类型,类似于面向对象的语言,它们被子代继承:

<xsd:complexType name="AbstractType" abstract="true">
    <xsd:sequence>
        <xsd:element name"BaseType">
            <xs:complexType>
                <xsd:sequence>
                    <xsd:element name="id" type="xsd:string" minOccurs="1" maxOccurs="1" >
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

现在,孩子们需要以下列方式从抽象类型继承:

<xsd:complexType name="ChildOne">
    <xsd:complexContent>
        <xsd:extension base="tns:AbstractType">
            <xsd:element name="newElement" type="xsd:string" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

其中newElement只是孩子定义的新元素。


编辑:更准确地说,id元素并不像面向对象语言那样真正继承,但是你可以达到同样的效果。不同的是,您必须在具体实现的XML中添加基类型。

<ChildOne>
    <BaseType>
        <id>someId</id>
    </BaseType>

    <!-- elements defined by child one goes here -->
    <newElement>new Element</newElement>
</ChildOne>