编辑:谢谢你的答案!我会尽快检查每个答案(预计从现在起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文件。
答案 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
但我认为它开始为空。索引0
或data
中没有任何内容。
当你这样做时,
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];
...
}