2017-02-23 9 views
0

WebAPIサービスコールへの応答を作成しています。デフォルトのXMLシリアライザは、ほとんど私のために働いています。私は何を生成する必要があることは、このようなものです:XMLシリアル化ランタイム(ASP.Net WebApi)中にXML要素の名前を変更する方法

<fooCollection> 
    <fooMember> 
    <fooType1> 
     ...bunch of properties for the fooMember 
    </fooType1> 
    </fooMember> 
    <fooMember> 
    <fooType2> 
     ...bunch of properties for the fooMember 
    </fooType2> 
    </fooMember> 
</fooCollection 

私が持っている問題は<fooType>要素が現在fooTypeと呼ばれる私のモデル内のオブジェクトです。応答の要素名は、fooMemberオブジェクトのtypeプロパティに応じて別の名前にする必要があります。これは、[DataContract][DataMember]のような属性を使用してオブジェクト名以外の名前を付けると動作しないように見えることを意味します。実行時に一度設定して変更する方法が見つからないためです。

私のモデルコードは次のようなものになります。

public partial class fooCollection { 
    private fooCollectionMember[] memberField; 

    [System.Xml.Serialization.XmlElementAttribute("fooMember")] 
    public fooCollectionMember[] member { get; set;} 
    } 

    public partial class fooCollectionMember { 
    private fooType fooTypeField; 
    public fooType fooType { get; set } 
    } 

    public partial class fooType { 
    private object fooProperty; 
    // ... more properties 
    public object fooProperty { get; set; } 
    // ... more properties 
    } 

は、私は私の要素名がその<fooType>要素のためにどうなるかを設定することもできますランタイム/連載中の方法はありますか?

また、fooTypeが残りのプロパティを持つオブジェクトではなく、fooMemberオブジェクトのプロパティで、他のすべてのプロパティとともにオブジェクトを作成するように、モデルを並べ替える方法はありますか?そのプロパティの値に名前が付けられ、残りのプロパティがその中にカプセル化されている<fooType>要素がシリアル化されていますか?

答えて

0

私の元のサービスコールgetメソッドは、このようなものだった:私は何も見つからなかった

public FooCollection Get() { 
     FooCollection foos = new FooCollection(); 
     // code to fill model 
     return foos; 
    } 

私はFooCollectionと変更でプロパティまたはオブジェクトに基づいて対応してXML要素を取ることができるようプロパティ/オブジェクトの値に基づくXMLレスポンスの要素の名前。つまり、XMLレスポンスで生成された要素のコレクションアイテムごとに異なる要素名を持つFooPropertyプロパティを持つことはできません。言い換えれば、このプロパティは、return-a-model-object-and-the-serialization-happen-automatically-automaticアプローチを使用すると、XMLドキュメント全体で単一の要素名しか持てません。しかし、私は、私が合っていると思うが、私は要素名を変更するための回避策を見つけた。

私のGet()サービスメソッドがFooCollectionタイプのオブジェクトを返し、返された後自動的にシリアル化されるのではなく、代わりにHttpResponseMessageオブジェクトを返します。こうすることで、モデルを手動でシリアル化して操作することができますが、それをHttpResponseMessageとして返します。

だから今、私のgetサービスメソッドが私の目標を達成するために、このような多くを見ることができます:

public HttpResponseMessage Get() { 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(FooCollection)); 
    System.IO.StringWriter stringWriter = new System.IO.StringWriter(); 
    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
    FooCollection foos = new FooCollection(); 
    // code to populate FooCollection model, assign namespaces, etc 
    xmlSerializer.Serialize(stringWriter, foos, namespaces); 
    // Now we can manipulate stringWriter value however is needed to replace the element names 
    return new HttpResponseMessage() { 
    Content = new StringContent(stringWriter.ToString(), Encoding.UTF8, "application/xml") 
    }; 
} 
関連する問題