序列化XML标签一样两次 [英] Serialize XML same tag twice

查看:119
本文介绍了序列化XML标签一样两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题:

我要序列化类XML文件。但是,两个属性必须被命名为具有相同的名称:

期望中的XML:

 < XML版本=1.0&GT?;
<试验>
  < HEADERTEXT>
    < Tag1中> AAA< / Tag1中>
  < / HEADERTEXT>
  < HEADERTEXT>
    <与Tag2> BBB< /与Tag2>
  < / HEADERTEXT>
< /试验>
 

我不需要反序列化回对象。

code:

 公共类头1
{
    [的XmlElement(Tag1中)]
    公共字符串Tag1中{获得;组; }
}

公共类头2
{
    [的XmlElement(与Tag2)]
    公共字符串与Tag2 {获得;组; }
}

公共类测试
{
    [的XmlElement(HEADERTEXT)]
    公共头1头1 {获得;组; }

    [的XmlElement(HEADERTEXT)]
    公共头2头2 {获得;组; }
}

VAR DOC =新测试
{
    头1 =新的头1 {则Tag1 =AAA},
    头2 =新的头2 {与Tag2 =BBB}
};

VAR XML =新的XmlSerializer(typeof运算(测试));
使用(VAR FS =新的FileStream(的test.xml,FileMode.Create))
{
    xml.Serialize(FS,DOC);
}
 

这code不起作用。

  

XML元素HEADERTEXT从命名空间'已经是present在当前范围内。使用XML属性来指定其他XML名称或命名空间的元素。

我该怎么办?

真实的例子:

 <产品>
    < RecordReference> 1-15991< / RecordReference>
    < MainSubject>
      < MainSubjectSchemeIdentifier> 66< / MainSubjectSchemeIdentifier>
      <主题code> 2'; /主题code取代;
    < / MainSubject>
    < MainSubject>
      &其中; MainSubjectSchemeIdentifier> 20℃/ MainSubjectSchemeIdentifier>
      < SubjectHeadingText>Venäläisiäkirjoja:uskonto,teosofia,mystiikka< / SubjectHeadingText>
    < / MainSubject>
< /产品>
 

解决方案

使用数组:

 公共类测试
{
    [的XmlElement(HEADERTEXT)]
    公共字符串[] HEADERTEXT {获得;组; }
}
 

然后:

  VAR DOC =新测试
{
    HEADERTEXT =新的[] {AAA,BBB}
};
VAR XML =新的XmlSerializer(typeof运算(测试));
使用(VAR FS =新的FileStream(的test.xml,FileMode.Create))
{
    xml.Serialize(FS,DOC);
}
 

也有作品名单,其中,串>


更新:

通过复杂的对象,你定义模型:

 公共类头
{
    公共字符串标记{获得;组; }
}
 

,然后你有这种模式的集合:

 公共类测试
{
    [的XmlElement(HEADERTEXT)]
    公共头[] HEADERTEXT {获得;组; }
}
 

然后序列化:

  VAR DOC =新测试
{
    HEADERTEXT =新的[]
    {
        新标题{标签=AAA},
        新标题{标签=BBB}
    }
};
VAR XML =新的XmlSerializer(typeof运算(测试));
使用(VAR FS =新的FileStream(的test.xml,FileMode.Create))
{
    xml.Serialize(FS,DOC);
}
 

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>

解决方案

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

这篇关于序列化XML标签一样两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆