2012-07-02 8 views
12

私は問題があります:XMLの同じタグを2回シリアル化する

クラスをXMLファイルにシリアライズする必要があります。私は戻ってオブジェクトにそれをデシリアライズする必要はありません

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

必要なXML:しかし、2つのプロパティが同じ名前で名前を付ける必要があります。

コード:

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名または名前空間を指定します。

どうすればよいですか?

実際の例:

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

、その後:

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

答えて

9

は、配列を使用し

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<string>で動作します。


UPDATE:あなたはモデルを定義する複雑なオブジェクトで

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

また公共一覧 HeaderText {} 'で動作します'、項目の追加/削除が容易です。 – Tisho

+0

@Tisho、yeap、私はこの情報を含めるために私の答えを更新しました。 –

+0

ありがとう、それは簡単なプロパティのために動作します。問題の更新されたコードをご覧ください。 – Lari13

8

あなたの現在のプロパティを無視するシリアライザを伝え、そして直列化の目的のために新しいものを追加することができます。

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