Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialize XML same tag twice

I've the problem:

I have to serialize class to XML file. But two properties must be named with the same name:

Desired xml:

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

I don't need to deserialize it back to object.

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

This code doesn't work.

The XML element 'HeaderText' from namespace '' is already present in the current scope. Use XML attributes to specify another XML name or namespace for the element.

What can I do?

Real-world example:

  <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>
like image 466
Lari13 Avatar asked Jul 02 '12 08:07

Lari13


1 Answers

Use an array:

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

and then:

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

Also works with List<string>.


UPDATE:

With complex objects you define a model:

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

and then you have a collection of this model:

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

and then you serialize:

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);
}
like image 109
Darin Dimitrov Avatar answered Oct 23 '22 11:10

Darin Dimitrov