2012-07-02 19 views
12

Sorun şu ki:Serialize XML iki kez aynı etiketi

Sınıfa XML dosyası serileştirmem gerekiyor. Ama iki özellik aynı adla adlandırılmış olması gerekir:

İstenilen xml: Ben itiraz geri serisini gerekmez

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

.

Kodu:

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

Bu kod çalışmaz.

'' Alan adından 'HeaderText' XML öğesi geçerli kapsamda zaten mevcut. Öğe için başka bir XML adı veya ad alanı belirtmek için XML niteliklerini kullanın.

Ne yapabilirim?

Gerçek hayattan örnek: sonra

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

ve:

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

Ayrıca List<string> ile çalışır

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

cevap

9

bir dizi kullanın.


GÜNCELLEME:

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

ve o zaman bir bu modelin koleksiyonu var: Eğer seri hale ardından

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

ve karmaşık nesneler ile

Bir modeli tanımlamak:

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

Ayrıca kamu List HeaderText {} 'ile çalışır ', Öğeleri Ekle/Kaldır daha kolay. – Tisho

+0

@Tisho, yeap, Bu bilgileri eklemek için cevabımı güncelledim. –

+0

Teşekkürler, basit özellikler için çalışır. Lütfen güncellenmiş kodu inceleyin. – Lari13

8

Eğer mevcut özelliklerini göz ardı etmek seri hale anlatmak ve serileştirme amacıyla yeni bir tane ekleyebilirsiniz:

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

Canlı örnek: http://rextester.com/YVEF64085

İlgili konular