svcutil を使用して XSD スキーマに基づいて一連のクラスを作成する既存のソリューションがあります。私は今、そのスキーマを編集する必要があり、ちょっとした障害に遭遇しました。
スキーマは、次のような型で拡張されます。
<xsd:complexType name="Awkward">
<xsd:sequence>
<xsd:element name="awkward1" type="tt:AwkwardChild" nillable="true">
</xsd:element>
<xsd:element name="awkward2" type="tt:AwkwardChild" nillable="true">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="AwkwardChild">
<xsd:simpleContent>
<xsd:extension base="tt:AwkwardChildType">
<xsd:attribute name="id" type="xsd:ID"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="AwkwardChildType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Dependent"/>
<xsd:enumeration value="In between"/>
<xsd:enumeration value="Independent"/>
</xsd:restriction>
</xsd:simpleType>
これにより、次のような XML 出力が得られます。
<Awkward>
<awkward1 id="z1">Dependent</awkward1>
<awkward2 id="z2">Independent</awkward2>
</Awkward>
この不満を生成しようとすると、SVCUtil が窒息します。
「名前空間 tt の型 'AwkwardChild' はインポートできません。単純なコンテンツ拡張を持つ複雑な型はサポートされていません。型がデータ コントラクト型にマップできるようにスキーマを変更するか、ImporXmlType を使用するか、別のシリアライザーを使用してください。」
そして、文字列型を出力しようとしているので、これを理解していると思いますが、それに属性を含めます。
この種の出力を実現するためにクラスをハンドコーディングできる方法があるかどうかを調べようとしていますが、文字列を xml ノードではなく「単純なコンテンツ」として表示する方法がわかりません。子要素として、たとえば次のクラス:
[DataContractAttribute(Name = "AwkwardChild", Namespace = "tt")]
public class Awkward
{
[DataContractAttribute(Name="id")]
public string id { get; set; }
//What do I put here to get this to appear as the content of
//the awkward node, not in an element?
public string nodecontent { get; set; }
}
誰かが私を正しい方向に向けることができますか?