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

时间:2013-02-07 17:23:28

标签: c# xml-serialization

我正在尝试序列化一个看起来像这样的Level对象:

public class Level
{
    //Some XmlAtributes

    [XmlElement]
    public List<Question> questions;
}

public class Question
{
    //Some XmlAttributes

    [XmlArray("Answers")]
    public List<string> answers;
}

into和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")]重命名元素,但这会将相同的名称应用于数组中的所有元素。

1 个答案:

答案 0 :(得分:0)

如果有其他人发生这种情况,这里是我采用的解决方案(感谢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);
    }
}

我做了回答它自己的类,因为它有属性,我不需要覆盖Question类中其他任何内容的序列化行为。额外的reader.Read()用于确保读取器移动到下一个标记之后,否则在处理Answer后反序列化将不会继续。

这不是100%完美,但对于我的实施来说已经足够了。