我创建了一个对象数组,但我无法填充它

时间:2013-11-26 17:38:42

标签: c# xml arrays

编辑:谢谢你的答案!我会尽快检查每个答案(预计从现在起9小时)。说实话,我没想到会有这么多答案,所以谢谢你们所有人。 stackoverflow看起来像一个伟大的社区,我很高兴我创建了一个帐户。

这是我的主要计划。我真的不明白为什么这不起作用...... Visual Studio中没有错误,但是一旦我运行程序,就会出现一个Null引用的异常。但我创造了对象! (Datacoll中)

public partial class frmClasstoXML : Form
{
    data daten = new data();
    dataCollection datacoll = new dataCollection();

    static int count = 0;

    public frmClasstoXML()
    {
        InitializeComponent();
    }

    private void cmdClassTOxml_Click(object sender, EventArgs e)
    {
        foreach (string lines in textBox1.Lines)
        {
            string[] teil = lines.Split(';');                

            datacoll.data[count].logicalname = teil[0];
            datacoll.data[count].klarname = teil[1];
            datacoll.data[count].wert = teil[2];
            datacoll.data[count].writeable = teil[3];
            datacoll.data[count].readable = teil[4];
            datacoll.data[count].timestamp = DateTime.Now.ToString();

            count++;
        }
        count = 0;

        XmlSerializer serializer = new XmlSerializer(typeof(dataCollection));
        string writepath = "test.xml";

        StreamWriter writer = new StreamWriter(writepath, false);
        serializer.Serialize(writer, datacoll);
        writer.Close();  
    }
}

这是我的data.cs文件:

public class data
{
    [System.Xml.Serialization.XmlElement("logicalname")]
    public string logicalname { get; set; }

    [System.Xml.Serialization.XmlElement("klarname")]
    public string klarname { get; set; }

    [System.Xml.Serialization.XmlElement("wert")]
    public string wert { get; set; }

    [System.Xml.Serialization.XmlElement("writeable")]
    public string writeable { get; set; }

    [System.Xml.Serialization.XmlElement("readable")]
    public string readable { get; set; }    

    [System.Xml.Serialization.XmlElement("timestamp")]
    public string timestamp { get; set; }
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("root")]
public class dataCollection
{
    [XmlArray("chambers")]
    [XmlArrayItem("value", typeof(data))]
    public data[] data { get; set; }
}

我的程序中有一个文本框,有5行(使用文本框的多行属性)。我想将此文本框解析为此对象并创建它的XML文件。

3 个答案:

答案 0 :(得分:2)

嗯,你永远不会实例化data的实例。您正在创建集合,但它只是可以指向数据对象的引用集合。当你第一次创建集合时,它们都是空的。

   foreach (string lines in textBox1.Lines)
    {
        string[] teil = lines.Split(';');

        datacoll.data[count] = new data();  // call constructor              

        datacoll.data[count].logicalname = teil[0];
        datacoll.data[count].klarname = teil[1];
        datacoll.data[count].wert = teil[2];
        datacoll.data[count].writeable = teil[3];
        datacoll.data[count].readable = teil[4];
        datacoll.data[count].timestamp = DateTime.Now.ToString();

        count++;
    }

只需添加构造函数调用,您就可以在datacoll.data[count]处设置新属性数据,然后设置属性。使用当前代码,我希望它在datacoll.data[count].logicalname上抛出NullReferenceException。

此外,您需要在构造函数中为数据收集分配一些大小的数组。您可以对其进行修改,以便int调用它并this.data = new data[lenght],或者,如果您希望动态增长,则可以将data[]更改为List<data>,在这种情况下你的foreach的身体会更像;

    datacoll.data.Add(new data { 
                                    logicalname = teil[0];
                                   //set rest of properties 
                                });

    data temp = new data();
    temp.logicalname = teil[0];
    // set rest of properties
    datacoll.data.Add(temp);

答案 1 :(得分:0)

您创建datacoll但我认为它开始为空。索引0data中没有任何内容。

当你这样做时,

datacoll.data[count].logicalname = teil[0];

dataCollection课程的内容来自哪里?

答案 2 :(得分:0)

您需要初始化数组以及数组中的每个项目:

datacoll.data = new data[textBox1.Lines.Length];

foreach (string lines in textBox1.Lines)
{
    string[] teil = lines.Split(';'); 

    datacoll.data[count] = new data();

    datacoll.data[count].logicalname = teil[0];
    ...
}