如何在序列化列表时创建递增的XML元素名称
本文关键字:XML 元素 创建 序列化 列表 | 更新日期: 2023-09-27 17:58:25
我正在尝试序列化一个Level对象,它看起来像这样:
public class Level
{
//Some XmlAtributes
[XmlElement]
public List<Question> questions;
}
public class Question
{
//Some XmlAttributes
[XmlArray("Answers")]
public List<string> answers;
}
到一个XML文件中,该文件如下所示:
<Level time="2">
<Question type="multiplechoice">
<Answers correct="b">
<a>Answer 1</a>
<b>Answer 2</b>
<c>Answer 3</c>
<d>Answer 4</d>
</Answers>
</Question>
<Question>
...
</Question>
</Level>
除了<Answers>
下的元素名称之外,我已经可以序列化它了。注意每个元素是如何获得递增的名称的,而不是所有元素都相同(例如默认情况下的<string>
)。这可能吗?我知道我可以用[XmlArrayItem("ItemName")]
重命名元素,但这将对数组中的所有元素应用相同的名称。
如果有其他人遇到这种情况,下面是我使用的解决方案(感谢IAbstract的提示):
public class Answer : IXmlSerializable
{
public List<string> list = new List<string>();
public string this[int pos]
{
get
{
return list[pos];
}
set
{
list[pos] = value;
}
}
public void ReadXml ( XmlReader reader )
{
reader.ReadToDescendant("a");
while ( reader.Name != "Answers" )
{
if ( reader.IsStartElement() )
{
list.Add(reader.ReadElementContentAsString());
}
}
reader.Read();
}
public void WriteXml ( XmlWriter writer )
{
for ( int i = 0; i < list.Count; i++ )
{
writer.WriteElementString(((char)(97 + i)).ToString(), list[i]);
}
}
public XmlSchema GetSchema()
{
return(null);
}
}
我让Answer成为它自己的类,因为它有属性,并且我不需要覆盖Question类中任何其他内容的序列化行为。额外的读者。Read()是为了确保读取器被移到后面的下一个标记,否则在处理Answer后反序列化将不会继续。
它不是100%完美的,但对于我的实现来说,这已经足够了。