2014-06-27 156 views
0

我有一個.net Web Api 2應用程序,它以XML形式提供數據。用父節點包裝XML根節點

我的問題:

我的一個班是這樣的:

public class Horse 
{ 
    public string Name { get;set; } 
    public string Category { get;set; } 
} 

當我序列化此,其結果是:

<Horse> 
    <Name>Bobo</Name> 
    <Category>LargeAnimal</Category> 
</Horse> 

我要的是包裝所有外發具有這樣的根元素的XML內容:

<Animal> 
    <Horse> 
    ..... 
    </Horse> 
</Animal> 

我一直希望在自定義的XmlFormatter中做到這一點。但我似乎無法弄清楚如何在writestream上附加一個根元素。

解決此問題的最佳方法是什麼?

我已經嘗試調整這個答案在我的自定義xmlserializer工作,但似乎並沒有工作。 How to add a root node to an xml?

(我有時間來寫這個問題的一個非常短的量,所以如果有任何遺漏,請發表評論。)

回答

0

所以..調整了這個問題的答案:How to add a root node to an xml?一起工作我XmlFormatter。

下面的代碼工作,雖然我覺得這是一個駭人聽聞的方法。

public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      XmlSerializer xs = new XmlSerializer(type); 

      XmlDocument temp = new XmlDocument(); //create a temporary xml document 
      var navigator = temp.CreateNavigator(); //use its navigator 
      using (var w = navigator.AppendChild()) //to get an XMLWriter 
       xs.Serialize(w, value);    //serialize your data to it 

      XmlDocument xdoc = new XmlDocument(); //init the main xml document 
      //add xml declaration to the top of the new xml document 
      xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "utf-8", null)); 
      //create the root element 
      var animal = xdoc.CreateElement("Animal"); 

      animal.InnerXml = temp.InnerXml; //copy the serialized content 
      xdoc.AppendChild(animal); 

      using (var xmlWriter = new XmlTextWriter(writeStream, encoding)) 
      { 
       xdoc.WriteTo(xmlWriter); 
      } 
     }); 
    }