3

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; }
    }

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

これは、SVCUtil ツールと XMLSerializer オプションを使用しても回避できませんでした。最後に、この特定のセクション用に、IXmlSerializable を実装し、書き込み XML メソッドで適切な XML を出力するクラスを手動でコーディングする必要がありました。以下の小さなサンプル スニペット。

writer.WriteStartElement("awkward1");

writer.WriteAttributeString("id1", "z1");

writer.WriteValue(nodeValue);

writer.WriteEndElement();
于 2013-12-16T13:43:41.583 に答える