6

クライアントのスキームと正確に一致する必要がある製品の xml フィードを作成しています。

私はウェブAPIを使用しています。プロパティ extractDate を属性にしたいと思います。次のコードは、属性ではなく要素として extractDate を出力しています

    public Feed GetProducts()
    {
             var feed = new Feed()
             {
                 extractDate = "extractDate",
                 incremental = true,
                 name = "name",
                 Brands = GetBrands(),
                 Categories = GetCategories(),
                 Products = GetProducts()
             };


         return feed;
    }

これが私のモデルのフィードです。以下は要素を属性に変えないように見えることに注意してください

[XmlAttribute(AttributeName = "extractDate")]
public class Feed
{
    [XmlAttribute(AttributeName = "extractDate")] //attribute is ignored
    public string extractDate { get; set; }
    public bool incremental { get; set; }
    public string name { get; set; }
    public List<Brand> Brands { get; set; }
    public List<Category> Categories { get; set; } 
    public List<Product> Products { get; set; } 
}

どのように出力するのですか

<feed extractDate="2012/01/01" 

// other logic

/>
4

3 に答える 3

11

Web API はデフォルトで XmlMediaTypeFormatter の DataContractSerializer を使用します。おそらくそれが、属性の装飾が有効になっていない理由です。期待される出力を表示するために、XmlMediaTypeFormatter で XmlSerializer を有効にしていますか?

config.Formatters.XmlFormatter.UseXmlSerializer = true;

また、次の API を使用して、特定の型に対してのみ XmlSerializer を設定することもできます。

config.Formatters.XmlFormatter.SetSerializer<>

于 2013-06-03T17:29:26.080 に答える
3

Managed を編集
して、空のプロジェクトで問題をシミュレートすると、Kiran の答えがうまくいくようです。
この行をコントローラーに追加するだけです(テスト目的のため、おそらくglobal.asaxにあるはずです)

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

クラスの上に [XmlRoot] がありますか、それともありませんか?
属性が xml クラス デコレータなしで機能するかどうかはわかりません。
簡単な健全性チェックは、Web API を使用せずにクラスをシリアル化して、ばかげたことではなく、実際に Web API に関連していることを確認することです。

于 2013-06-03T13:27:26.137 に答える
0

これはどう:

[XmlRoot("feed")]
public class Feed
{
     [XmlAttribute(AttributeName = "extractDate")]
     public string extractDate { get; set; }

     public bool incremental { get; set; }
     public string name { get; set; }
     public List<Brand> Brands { get; set; }
     public List<Category> Categories { get; set; } 
     public List<Product> Products { get; set; } 
}
于 2013-06-03T15:17:38.580 に答える