c# .net xml exception-handling xml-serialization

c# - Serializar la misma etiqueta XML dos veces



.net exception-handling (2)

Tengo el problema:

Tengo que serializar la clase al archivo XML. Pero dos propiedades deben nombrarse con el mismo nombre:

Xml deseado:

<?xml version="1.0"?> <Test> <HeaderText> <Tag1>AAA</Tag1> </HeaderText> <HeaderText> <Tag2>BBB</Tag2> </HeaderText> </Test>

No necesito deserializarlo para objetar.

Código:

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

Este código no funciona.

El elemento XML ''HeaderText'' del espacio de nombres '''' ya está presente en el alcance actual. Use atributos XML para especificar otro nombre XML o espacio de nombres para el elemento.

¿Que puedo hacer?

Ejemplo del mundo real:

<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>


Podría decirle al serializador que ignore sus propiedades actuales y agregue una nueva para la serialización:

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

Ejemplo en vivo: http://rextester.com/YVEF64085


Usa una matriz:

public class Test { [XmlElement("HeaderText")] public string[] HeaderText { get; set; } }

y entonces:

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

También funciona con List<string> .

ACTUALIZAR:

Con objetos complejos define un modelo:

public class Header { public string Tag { get; set; } }

y luego tienes una colección de este modelo:

public class Test { [XmlElement("HeaderText")] public Header[] HeaderText { get; set; } }

y luego serializas:

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