13

私は問題を抱えています:

クラスをXMLファイルにシリアル化する必要があります。ただし、2つのプロパティには同じ名前を付ける必要があります。

必要なxml:

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

オブジェクトに逆シリアル化する必要はありません。

コード:

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

私に何ができる?

実際の例:

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

2 に答える 2

11

配列を使用します。

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

その後:

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>ます。


アップデート:

複雑なオブジェクトを使用して、モデルを定義します。

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);
}
于 2012-07-02T09:06:47.157 に答える
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

于 2012-07-02T09:13:01.703 に答える