扩展XSD以放置单个元素,而不是在XSD中使用xs:any

时间:2014-10-26 23:59:44

标签: java xml web-services soap jax-ws

我有一个带xs:any的XSD 这允许我插入我选择的任何标签/元素。 但是,我想扩展这个XSD,以便我可以指定自己的特定元素,而不是使用xs:any。

我不想编辑相同的XSD,但创建了一个扩展XSD,它添加了我想要使用的特定元素,而不是使用xs:any

这是我的XSD的一部分。

...
...
... 
<xs:element name="MRegReq" type="mss:MRegReqType" />
<xs:complexType name="MRegReqType">
    <xs:complexContent>
        <xs:extension base="mss:MessageAbstractType">
            <xs:sequence>
                <xs:element name="User" type="mss:UserType" />
                <xs:element name="EData" type="xenc:EDataType"
                    minOccurs="0" />
                <xs:any namespace="##other" processContents="lax" minOccurs="0"
                    maxOccurs="unbounded" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

在上面,

是我想用扩展替换的,所以当我使用JAX-WS重新生成存根等时,我可以访问XSD扩展中指定的各个元素(而不是必须获取request.getAny ()并遍历节点以获取每个元素)。

任何指针/帮助都会非常感激

1 个答案:

答案 0 :(得分:0)

您无法替换扩展程序中的元素:

  

Schema Component Constraint: Derivation Valid (Extension)

     

如果{derivation method}是扩展名,则以下内容中的适当大小写必须为真:

     

...

     

1.2其{attribute uses}必须是复杂类型定义本身的{attribute uses}的子集,也就是说,对于{base type definition}的{attribute uses}中使用的每个属性,必须有属性使用复杂类型定义本身的{attribute uses},其{attribute declaration}具有相同的{name},{target namespace}和{type definition}作为其属性声明。

用简单语言:扩展名必须包含所有元素作为具有相同名称,名称空间和类型的基本类型。


但创建另一个扩展名不应该是一个问题:

<xs:choice>
    <xs:element name="MRegReqA" type="mss:MRegReqTypeA" />
    <xs:element name="MRegReqB" type="mss:MRegReqTypeB" />
</xs:choice>

<xs:complexType name="MRegReqType">
    <xs:complexContent>
        <xs:extension base="mss:MessageAbstractType">
            <xs:sequence>
                <xs:element name="User" type="mss:UserType" />
                <xs:element name="EData" type="xenc:EDataType" minOccurs="0" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="MRegReqTypeA">
    <xs:complexContent>
        <xs:extension base="mss:MRegReqType">
            <xs:sequence>
                <xs:element name="Product" type="mss:ProductType" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="MRegReqTypeB">
...