Сериализовать те же теги XML дважды
У меня проблема:
Мне нужно сериализовать класс в файл XML. Но два свойства должны быть названы с тем же именем:
Желаемый xml:
<?xml version="1.0"?>
<Test>
<HeaderText>
<Tag1>AAA</Tag1>
</HeaderText>
<HeaderText>
<Tag2>BBB</Tag2>
</HeaderText>
</Test>
Мне не нужно десериализовать его обратно на объект.
код:
public class Header1
{
[XmlElement("Tag1")]
public String Tag1 { get; set; }
}
public class Header2
{
[XmlElement("Tag2")]
public String Tag2 { get; set; }
}
public class Test
{
[XmlElement("HeaderText")]
public Header1 Header1 { get; set; }
[XmlElement("HeaderText")]
public Header2 Header2 { get; set; }
}
var doc = new Test
{
Header1 = new Header1 { Tag1 = "AAA" },
Header2 = new Header2 { Tag2 = "BBB" }
};
var xml = new XmlSerializer(typeof(Test));
using (var fs = new FileStream("test.xml", FileMode.Create))
{
xml.Serialize(fs, doc);
}
Этот код не работает.
XML-элемент 'HeaderText' из пространства имен '' уже присутствует в текущей области. Используйте атрибуты XML, чтобы указать другое имя XML или пространство имен для элемента.
Что я могу сделать?
Пример реального мира:
<Product>
<RecordReference>1-15991</RecordReference>
<MainSubject>
<MainSubjectSchemeIdentifier>66</MainSubjectSchemeIdentifier>
<SubjectCode>2</SubjectCode>
</MainSubject>
<MainSubject>
<MainSubjectSchemeIdentifier>20</MainSubjectSchemeIdentifier>
<SubjectHeadingText>Venäläisiä kirjoja: uskonto, teosofia, mystiikka</SubjectHeadingText>
</MainSubject>
</Product>
Ответы
Ответ 1
Используйте массив:
public class Test
{
[XmlElement("HeaderText")]
public string[] HeaderText { get; set; }
}
а затем:
var doc = new Test
{
HeaderText = new[] { "AAA", "BBB" }
};
var xml = new XmlSerializer(typeof(Test));
using (var fs = new FileStream("test.xml", FileMode.Create))
{
xml.Serialize(fs, doc);
}
Также работает с List<string>
.
UPDATE:
С помощью сложных объектов вы определяете модель:
public class Header
{
public string Tag { get; set; }
}
а затем у вас есть коллекция этой модели:
public class Test
{
[XmlElement("HeaderText")]
public Header[] HeaderText { get; set; }
}
а затем вы выполните сериализацию:
var doc = new Test
{
HeaderText = new[]
{
new Header { Tag = "AAA" },
new Header { Tag = "BBB" }
}
};
var xml = new XmlSerializer(typeof(Test));
using (var fs = new FileStream("test.xml", FileMode.Create))
{
xml.Serialize(fs, doc);
}
Ответ 2
Вы можете сказать, что сериализатор игнорирует ваши текущие свойства и добавляет новый для сериализации:
public class Test
{
[XmlIgnore]
public String Header1 { get; set; }
[XmlIgnore]
public String Header2 { get; set; }
[XmlElement("HeaderText")]
public String[] HeaderText
{
get{ return new[]{Header1,Header2}; }
set{ if(value.Length == 2) { Header1 = value[0]; Header2 = value[1];} }
}
}
Пример в реальном времени: http://rextester.com/YVEF64085