使用父节点包装XML根节点

时间:2014-06-27 08:05:48

标签: c# xml xml-serialization xmlserializer asp.net-web-api2

我有一个.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?

(我写这个问题的时间非常短,所以如果遗漏任何内容,请发表评论。)

1 个答案:

答案 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);
            }
        });
    }