2013-06-03 10 views
6

クライアントスキームと正確に一致する必要がある製品のXMLフィードを作成しています。web apiとモデルバインディングを使用してxml属性を定義する方法

私はWeb 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 

/> 
+0

[どのように私は、XMLは、MVC Webでアクションモデルに属性を結合しないのが重複する可能性API?](http://stackoverflow.com/questions/10641426/how-do-i-bind-xml-attributes-to-the-action-model-in-mvc-web-api) –

+0

上記の投稿はベータリリースに関連している。私はこれを読んだが、今は当てはまるとは確信していない。私の感情は、明らかに何かが欠けているということです。 – frosty

答えて

10

のWeb APIはXmlMediaTypeFormatterにDataContractSerializerを使用し、おそらくそれはあなたがあなたの属性の装飾が有効に取って見ていないされている理由です。 XmlMediaTypeFormatterでXmlSerializerを有効にして、期待される出力を確認しますか?

config.Formatters.XmlFormatter.UseXmlSerializer = true;

また、あなただけの、あまりにも次のAPIを使用して、特定のタイプのためのXmlSerializerを設定できます

config.Formatters.XmlFormatter.SetSerializer<>

+0

ありがとう、これは働いた。私はクリスタフコードをグローバルasaxで使用しました – frosty

3

編集
は、空のプロジェクトであなたの問題をシミュレートするために管理し、キランの答えがあるようですI出力を行う方法トリック。
だけ(テスト目的のために、それはおそらくあなたのglobal.asaxにする必要があります)お使いのコントローラでは、この行を追加します

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

あなたは[XMLRootは]あなたのクラスの上またはそれが欠落しているがありますか?
属性がxmlクラスデコレータなしで機能するかどうかわかりません。
あなたができる簡単な健全性チェックは、それが何も愚かではなく、実際にWeb API関連であることを確認するために関与するWeb APIなしでクラスをシリアライズすることです。

+0

ありがとう、非常に便利です。だから私はxml.serializerを使用してテストしたばかりの変更なしで[XmlRoot]をクラス名の上に追加しました。このバージョンでは属性は正しいです。 Web APIからシリアル化されたバージョンを出力できる方法はありますか?更新のためにもう一度 – frosty

+0

に感謝します。 – frosty

+0

このコード行は、Web Apiで、パラメータとして使用されている複合型のXmlRootAttributeおよびXmlTypeAttributeを「無視する」問題を修正して返します。 – SixOThree

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

こんにちは、ありがとうございます。私はこれを試した。しかし、それでも出力には影響しません。これはあなたのために働きますか? – frosty

+0

実際にはあります。それはばかげているかもしれませんが、他のフィールドの上に** [XmlElement] **を入れてみてください... – pobed2

+0

とGlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = trueを忘れないでください。 – tartakynov

関連する問題