Оберните корневой узел XML родительским узлом

У меня есть приложение .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, но, похоже, не работает. Как добавить корневой узел в xml?

(У меня было очень мало времени, чтобы написать этот вопрос, поэтому, если чего-то не хватает, оставьте комментарий.)


person Are Almaas    schedule 27.06.2014    source источник


Ответы (1)


Итак.. Подправил ответ на этот вопрос: Как добавить корневой узел в 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);
            }
        });
    }
person Are Almaas    schedule 27.06.2014