オブジェクトを XML 要求にシリアル化する必要がありますが、呼び出しているサービスは空の要素を受け入れません。
XSD からコントラクト クラスを生成しました。リクエスト構造は次のようになります。
/* Generated contracts - simplified & without XML attributes */
public class Request
{
public Request()
{
filters = new RequestFilters();
properties = new ResultProperties();
}
public RequestFilters filters { get; set; }
public ResultProperties properties { get; set; }
}
public class ResultProperties
{
public ResultProperties()
{
props = new List<string>();
}
public List<string> props { get; set; }
}
public class RequestFilters
{
public RequestFilters()
{
ids = new LongFilter();
names = new StringFilter();
}
public LongFilter ids { get; set; }
public StringFilter names { get; set; }
}
public class LongFilter
{
public LongFilter()
{
values = new List<long>();
}
public List<long> values { get; set; }
}
public class StringFilter
{
public StringFilter()
{
values = new List<string>();
}
public List<string> values { get; set; }
}
コード生成にはxsd2codeを使用し、シリアル化から空のコレクションを除外するように構成しました。オブジェクト作成時
Request request = new Request();
ResultProperties rp = new ResultProperties();
rp.props.Add("foo");
rp.props.Add("bar");
request.properties = rp;
XML にシリアル化できます。
<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<filters>
<ids />
<names />
</filters>
<properties>
<props>
<string>foo</string>
<string>bar</string>
</props>
</properties>
</Request>
<ids />
ただし、バックエンド サービスは空要素と要素について不平を言い<names />
ます。
これらの空の要素をシリアル化された XML から除外する方法はありますか?
<ids />
andをなんとか除外できたら、最終的に要素も<names />
取り除きたいと思います。<filters>
ありがとう。
更新: XSD の関連部分を追加
<xs:schema>
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="filters" type="ouext:RequestFilters" minOccurs="0" />
<xs:element name="properties" type="ouext:ResultProperties" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="RequestFilters">
<xs:sequence>
<xs:element name="ids" type="filters:LongFilter" minOccurs="0" />
<xs:element name="names" type="filters:StringFilter" minOccurs="0" />
<xs:sequence>
</xs:complexType>
<xs:complexType name="LongFilter">
<xs:sequence>
<xs:element name="values" type="filters:LongInFilter" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LongInFilter">
<xs:sequence>
<xs:element name="value" type="xs:long" minOccurs="0" maxOccurs="20000" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="StringFilter">
<xs:sequence>
<xs:element name="values" type="filters:StringInFilter" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="StringInFilter">
<xs:sequence>
<xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="20000" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ResultProperties">
<xs:sequence>
<xs:element name="props" type="filters:StringInFilter" minOccurs="0" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
更新:シリアル化は次のように行われます
string xmlPayload = null;
XmlSerializer serializer = new XmlSerializer(typeof(Request));
using (StringWriter sw = new StringWriter())
{
using (XmlWriter xw = XmlWriter.Create(sw))
{
serializer.Serialize(xw, payload); // payload is initialized object of Request type
xmlPayload = sw.ToString();
}
}