两次序列化XML相同的标记

我有问题:

我必须将类序列化为XML文件。 但是必须使用相同的名称命名两个属性:

期望的xml:

   AAA   BBB   

我不需要将它反序列化回对象。

码:

 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名称或命名空间。

我能做什么?

现实世界的例子:

   1-15991  66 2   20 Venäläisiä kirjoja: uskonto, teosofia, mystiikka   

使用数组:

 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


更新:

对于复杂对象,您可以定义模型:

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

您可以告诉序列化程序忽略您当前的属性,并为序列化添加一个新属性:

 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