Serialize XML same tag twice

倖福魔咒の 提交于 2019-12-08 15:02:45

问题


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>

回答1:


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



回答2:


You could tell the serializer to ignore your current properties, and add a new one for the purpose of serialization:

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

Live example: http://rextester.com/YVEF64085



来源:https://stackoverflow.com/questions/11290564/serialize-xml-same-tag-twice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!