我应该如何定义我的XSD以将动态类型用作元素?

时间:2014-09-11 10:03:47

标签: xml xsd

我正在为要发送到接受以下请求的Web服务的SOAP请求定义XSD架构:

<generic.GenericObject.configureInstanceWithResult xmlns="xmlapi_1.0">
    [..]
    <configInfo>
        <lte.Cell>
            <actionMask>
                <bit>modify</bit>
            </actionMask>
            <spare1>1</spare1>
        </lte.Cell>
    </configInfo>
</generic.GenericObject.configureInstanceWithResult>
<generic.GenericObject.configureInstanceWithResult xmlns="xmlapi_1.0">
    [...]
    <configInfo>
        <lte.LteNeighboringCellRelation>
            <actionMask>
                <bit>modify</bit>
            </actionMask>
            <cellIndividualOffset>-1</cellIndividualOffset>
        </lte.LteNeighboringCellRelation>
    </configInfo>
</generic.GenericObject.configureInstanceWithResult>    

为了实现这个结果,我尝试了这个模式定义:

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

<complexType name="Generic.GenericObject.configureInstanceWithResult">
    <sequence>
        [...]
        <element name="configInfo" type="tns:ConfigInfo" />
    </sequence>
</complexType>

<complexType name="ConfigInfo">
    <sequence>
        <element name="payload" type="anyType" />
    </sequence>
</complexType>

<complexType name="lte.Cell">
    <sequence>
        <element name="spare" type="string" />
    </sequence>
</complexType>

<complexType name="lte.LteNeighboringCellRelation">
    <sequence>
        <element name="qOffsetCell" type="string" />
        <element name="cellIndividualOffset" type="string" />
    </sequence>
</complexType>

<element name="generic.GenericObject.configureInstanceWithResult" type="tns:Generic.GenericObject.configureInstanceWithResult" />

但我得到的结果就是这个:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<generic.GenericObject.configureInstanceWithResult xmlns="xmlapi_1.0">
    <configInfo>
        <payload xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="lte.Cell">
            <spare>-1</spare>
        </payload>
    </configInfo>
</generic.GenericObject.configureInstanceWithResult>

您是否认为xsi:type="lte.Cell"取代<lte.Cell>而不是<payload>的任何方式?

注意:在ConfigInfo中使用anyType并不好,因为<configInfo>被删除且请求不再符合要求。

2 个答案:

答案 0 :(得分:1)

如评论所述,我认为他们最好的办法就是将any作为<ConfigInfo>中的元素:

<complexType name="ConfigInfo">
    <sequence>
       <any minOccurs="0" maxOccurs="1"/>
    </sequence>
</complexType>

这允许您在XML中引入标有@XmlRootElement的任何类型的对象。

在这种特殊情况下,我在模式中定义了两个类符合&#34; payload&#34;,需要引入元素声明,因此它们被正确标记为@XmlRootElement

<element name="lte.Cell" type="tns:Lte.Cell" />
<element name="lte.LteNeighboringCellRelation" type="tns:Lte.LteNeighboringCellRelation" />

答案 1 :(得分:0)

将有效负载转换为全局元素声明(最好使用abstract =“true”),并为lte.Cell和lte.LteNeighboringCellRelation创建指定substitutionGroup =“payload”的元素声明。