我正在为要发送到接受以下请求的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>
被删除且请求不再符合要求。
答案 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”的元素声明。