У нас есть WSDL, который содержит следующее определение типа:
...
<xsd:complexType name="OrderItem">
<xsd:all>
<xsd:element name="source" type="xsd:string" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="OrderItems">
<xsd:sequence>
<xsd:element name="item" type="tns:OrderItem" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
...
При добавлении службы в качестве ссылки на службу в VS 2010 класс OrderItems
содержит свойство item
типа OrderItem[]
. Затем запрос SOAP генерируется следующим образом:
...
<items>
<OrderItem>
<item>foo</item>
<item>bar</item>
</OrderItem>
</items>
...
С помощью атрибутов XmlArray
и XmlArrayItem
мы можем управлять именами элементов <OrderItem>
и <item>
соответственно, но не можем получить нужную структуру:
...
<items>
<item>foo</item>
<item>bar</item>
</items>
...
Я знаю, что этой проблемы можно было бы избежать, если бы WSDL указывал что-то вроде <xsd:restriction base="soap-enc:Array">
, а не неограниченную последовательность, но, учитывая вышеизложенное, это единственный способ использовать какую-то пользовательскую сериализацию?
EDIT: пример WSDL на https://gist.github.com/1422704