如何在序列化列表时创建递增的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")]重命名元素,但这将对数组中的所有元素应用相同的名称。

如何在序列化列表时创建递增的XML元素名称

如果有其他人遇到这种情况,下面是我使用的解决方案(感谢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%完美的,但对于我的实现来说,这已经足够了。