Как изменить имя корневого элемента при сохранении содержимого с помощью XmlSerializer? - PullRequest
8 голосов
/ 22 сентября 2009

У меня есть документ XML:

<data>
    <elmt1>Element 1</elmt1>
    <elmnt2>Element 2</elmnt2>
    <elmnt3>Element 3</elmnt3>
</data>

Мне нужно десериализовать объект, который сериализуется под другим корневым именем, а все остальное остается прежним.

Например:

<dataNew>
    <elmt1>Element 1</elmt1>
    <elmnt2>Element 2</elmnt2>
    <elmnt3>Element 3</elmnt3>
</dataNew>

При сериализации мы всегда можем применить XmlRootAttribute для сериализации с другим корневым именем, но я не уверен, как десериализовать с другим XmlRootAttribute. Не удается error in document (1,2) указывать на корневой атрибут.

Как мне этого добиться?

Ответы [ 6 ]

12 голосов
/ 01 марта 2016

Если вы хотите изменить только корневое имя, вы можете указать корневой атрибут при объявлении XmlSerializer.

XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew"));
11 голосов
/ 22 сентября 2009

Атрибут XmlRootAttribute должен был работать

[XmlRoot("dataNew")]
public class MyData()
{
    [XmlElement("elmt1")]
    public string myElement1{get;set;}

    [XmlElement("elmnt2")]
    public string myElement2{get;set;}

    [XmlElement("elmtn3")]
    public string myElement3{get;set;}

}

РЕДАКТИРОВАТЬ: Завершено XML

5 голосов
/ 22 сентября 2009

Вы пытались использовать класс XmlAttributeOverrides ?

4 голосов
/ 22 сентября 2009

пример использования XmlAttributeOverrides. Если вы проголосуете, дайте также hjb417

class Program
{
    static void Main(string[] args)
    {
        using (var fs = File.OpenRead("XmlFile1.xml"))
        using (var fs2 = File.OpenRead("XmlFile2.xml"))
        {
            var xSer = new XmlSerializer(typeof(data));
            var obj = xSer.Deserialize(fs);
        //
            var xattribs = new XmlAttributes();
            var xroot = new XmlRootAttribute("dataNew");
            xattribs.XmlRoot = xroot;
            var xoverrides = new XmlAttributeOverrides();
            xoverrides.Add(typeof(data), xattribs);
            var xSer2 = new XmlSerializer(typeof(data), xoverrides);
            var obj2 = xSer2.Deserialize(fs2);
        }
    }
}

public class data
{
    public string elmt1 { get; set; }
    public string elmnt2 { get; set; }
    public string elmnt3 { get; set; }
}
0 голосов
/ 15 ноября 2016

Вы можете использовать ExtendedXmlSerializer . Эта поддержка сериализатора изменяет имя корневого элемента и имя свойства. Если у вас есть такой класс:

[XmlRoot("dataNew")]
public class Data
{
    [XmlElement("elmt1")]
    public string Element1 { get; set; }

    [XmlElement("elmnt2")]
    public string Element2 { get; set; }

    [XmlElement("elmtn3")]
    public string Element3 { get; set; }
}

Вы можете сериализовать его:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Data
    {
        Element1 = "A",
        Element2 = "B",
        Element3 = "C",
    };
var xml = serializer.Serialize(obj);

Ваш xml будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<dataNew type="Models.Example">
    <elmt1>A</elmt1>
    <elmnt2>B</elmnt2>
    <elmtn3>C</elmtn3>
</dataNew>

ExtendedXmlSerializer имеет много других полезных функций:

  • десериализация xml из стандартного XMLSerializer
  • Класс сериализации с интерфейсом свойства
  • Циркулярная ссылка и идентификационный номер сериализации
  • десериализация старой версии xml
  • Шифрование свойств
  • Пользовательский сериализатор

ExtendedXmlSerializer поддерживает .net 4.5 и .net Core. Вы можете интегрировать его с WebApi и AspCore.

0 голосов
/ 22 сентября 2009

Возможно, вам придется реализовать ISerializable и изменить корневой элемент в GetObjectData ().

...