2012-07-02 8 views
12

Ich habe das Problem:Serialize XML selbe Tag zweimal

Ich muss Klasse in XML-Datei serialisieren. Aber zwei Eigenschaften müssen mit dem gleichen Namen genannt werden:

Desired xml:

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

Ich brauche es nicht zu deserialisieren zurück zu widersprechen.

Code:

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

Dieser Code funktioniert nicht.

Das XML-Element 'HeaderText' aus Namespace '' ist bereits im aktuellen Bereich vorhanden. Verwenden Sie XML-Attribute, um einen anderen XML-Namen oder -Namespace für das Element anzugeben.

Was kann ich tun?

Praxisbeispiel:

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

Antwort

9

ein Array verwenden:

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

und dann:

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

arbeitet auch mit List<string>.


UPDATE:

Bei komplexen Objekten definieren Sie ein Modell:

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

und dann haben Sie eine Sammlung von diesem Modell:

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

und dann Sie serialisiert:

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

arbeitet auch mit 'public List Header {} ', einfacher zum Hinzufügen/Entfernen von Elementen. – Tisho

+0

@Tisho, yeap, ich habe meine Antwort aktualisiert, um diese Informationen zu enthalten. –

+0

Danke, es funktioniert für einfache Eigenschaften. Bitte beachten Sie den aktualisierten Code in Frage. – Lari13

8

Sie könnten den Serializer informieren Sie Ihren aktuellen Eigenschaften zu ignorieren und eine neue für die Zwecke der Serialisierung hinzufügen:

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

anschauliches Beispiel: http://rextester.com/YVEF64085