2012-07-02 15 views
12

Tengo el problema:Serialize XML misma etiqueta dos veces

Tengo que serializar la clase en el archivo XML. Sin embargo, dos propiedades deben ser nombrados con el mismo nombre:

XML deseado:

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

No necesito deserializar nuevo a 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 ámbito actual. Use atributos XML para especificar otro nombre XML o espacio de nombres para el elemento.

¿Qué 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> 

Respuesta

9

utilizar una matriz:

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

y luego:

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 trabaja con List<string>.


ACTUALIZACIÓN:

Con objetos complejos que definen un modelo:

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

y entonces usted tiene una colección de este modelo:

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

y luego serializa:

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

También funciona con 'Lista pública HeaderText {} ', es más fácil agregar/quitar elementos. – Tisho

+0

@Tisho, yeap, he actualizado mi respuesta para incluir esta información. –

+0

Gracias, funciona para propiedades simples. Por favor vea el código actualizado en cuestión. – Lari13

8

Se podría decir que el serializador hacer caso omiso de sus propiedades actuales, y añadir uno nuevo con el propósito de 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 vivo: http://rextester.com/YVEF64085

Cuestiones relacionadas