Сериализация атрибута XmlRoot в файл

У меня есть следующий код, сериализующий объект в файл:

TemplateClass item = new TemplateClass();
// Fill in item
XmlSerializer writer = new XmlSerializer(typeof(TemplateClass));
using (StreamWriter file = new StreamWriter(filePath))
{
   writer.Serialize(file, item);
}

где TemplateClass определяется следующим образом:

public class TemplateClass
{
    public List<SubTemplate> Accounts;
}

[XmlRoot(ElementName = "Account")]
public class SubTemplate
{
    public string Name;
    public string Region;
}

Я ожидал, что атрибут XmlRoot напишет Account вместо SubTemplate в файле. Но вывод файла в настоящее время выглядит так:

<TemplateClass>
  <Accounts>
    <SubTemplate>
       <Name>SampleName</Name>
       <Region>SampleRegion</Region>
    </SubTemplate>
  </Accounts>
</TemplateClass>

Как я могу изменить свой код так, чтобы результат выглядел так:

<TemplateClass>
  <Accounts>
    <Account>
       <Name>SampleName</Name>
       <Region>SampleRegion</Region>
    </Account>
  </Accounts>
</TemplateClass>

Я не хочу менять имя класса SubTemplate на Account.

1 ответ

Решение

Вы можете удалить [XmlRoot(...)] атрибут из SubTemplate учебный класс.

Есть несколько возможных решений:

  1. С помощью [XmlArray] а также [XmlArrayItem] атрибуты:

    Добавьте эти атрибуты в Accounts член TemplateClass:

    public class TemplateClass
    {
        [XmlArray("Accounts")]
        [XmlArrayItem("Account")]
        public List<SubTemplate> Accounts;
    }
    
  2. С использованием [XmlType] атрибут:

    Вы можете использовать этот атрибут вместо первоначально использованного [XmlRoot] на SubTemplate учебный класс.

    [XmlType("Account")]
    public class SubTemplate
    {
        public string Name;
        public string Region;
    }
    

Оба они будут производить следующий вывод:

<?xml version="1.0" encoding="utf-8"?>
<TemplateClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Accounts>
    <Account>
      <Name>First name</Name>
      <Region>First region</Region>
    </Account>
    <Account>
      <Name>Second name</Name>
      <Region>Second region</Region>
    </Account>
  </Accounts>
</TemplateClass>
Другие вопросы по тегам