序列化XML标签一样两次 [英] Serialize XML same tag twice
问题描述
我有问题:
我要序列化类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屋!