我有一个.net Web Api 2应用程序,它以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中执行此操作。但我似乎无法弄清楚如何在写入流上附加根元素。
解决此问题的最佳方法是什么?
我试过调整这个答案,以便在我的自定义xmlserializer中工作,但似乎不起作用。 How to add a root node to an xml?
(我写这个问题的时间非常短,所以如果遗漏任何内容,请发表评论。)
答案 0 :(得分:1)
所以..调整了这个问题的答案:How to add a root node to an xml?使用我的XmlFormatter。
以下代码有效,但我觉得这是一种hackish方法。
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);
}
});
}