使用C#使用XmlReader正确读取XML文件

本文关键字:使用 XML 文件 读取 XmlReader | 更新日期: 2023-09-27 18:30:07

我正在写一个简短的程序,它显示了我所有的待办事项。我有两个标签。1个选项卡用于创建新的待办事项,另一个选项卡用于显示我选择的每个待办事项的详细信息。因此,我必须将创建的待办事项保存在一个xml文件中。为此,我使用了DataTable和DataSet,它运行良好。这是我的代码:

private void btn_Save_Click(object sender, EventArgs e)
        {
            DataSet dataset = new DataSet();
            if (File.Exists(@"C:'Users'rs'Desktop'Test'save.xml"))
            {
                dataset.ReadXml(@"C:'Users'rs'Desktop'Test'save.xml");
                dataset.Tables[0].Rows.Add(txt_Name.Text, combox_Priority.Text, txt_Beginn.Text, txt_EndSoll.Text, txt_EndIst.Text, txt_Bemerkungen.Text);
                dataset.WriteXml(@"C:'Users'rs'Desktop'Test'save.xml");
            }
            else
            {
                DataTable datatable = new DataTable();
                datatable.TableName = "SaveInput";
                DataColumn dc1 = new DataColumn("Name");
                DataColumn dc2 = new DataColumn("Priority");
                DataColumn dc3 = new DataColumn("StartDate");
                DataColumn dc4 = new DataColumn("EndDateSoll");
                DataColumn dc5 = new DataColumn("EndDateIst");
                DataColumn dc6 = new DataColumn("Comment");
                datatable.Columns.Add(dc1);
                datatable.Columns.Add(dc2);
                datatable.Columns.Add(dc3);
                datatable.Columns.Add(dc4);
                datatable.Columns.Add(dc5);
                datatable.Columns.Add(dc6);
                datatable.Rows.Add(txt_Name.Text, combox_Priority.Text, txt_Beginn.Text, txt_EndSoll.Text, txt_EndIst.Text, txt_Bemerkungen.Text);
                DataSet dataset2 = new DataSet();
                dataset2.Tables.Add(datatable);
                dataset2.DataSetName = "iToDo";
                dataset2.WriteXml(@"C:'Users'rs'Desktop'Test'save.xml");
            }
            XmlTextReader xmlreader = new XmlTextReader(@"C:'Users'rs'Desktop'Test'save.xml");
            XmlNodeType nodetype;
            while (xmlreader.Read())
            {
                nodetype = xmlreader.NodeType;
                if (nodetype == XmlNodeType.Element)
                {
                    if (xmlreader.Name == "Name")
                    {
                        xmlreader.Read();
                        combox_Name2.Items.Add(xmlreader.Value);
                    }
                    else if (xmlreader.Name == "Priority")
                    {
                        xmlreader.Read();
                    }
                    else if (xmlreader.Name == "StartDate")
                    {
                        xmlreader.Read();
                    }
                    else if (xmlreader.Name == "EndDateSoll")
                    {
                        xmlreader.Read();
                    }
                    else if (xmlreader.Name == "EndDateIst")
                    {
                        xmlreader.Read();
                    }
                    else if (xmlreader.Name == "Comment")
                    {
                        xmlreader.Read();
                    }
                }
            }
            xmlreader.Close();
        }

我现在的问题是:我希望每次我选择我创建的"待办事项"时,它都能向我显示正确的详细信息。所以我用的是SelectedIndexChanged。我也使用

if (combox_Name2.SelectedIndex > -1)
            {
            }

但我认为我没有正确编码,因为细节没有显示出来。有人能给我一个提示吗?我整个下午都在编辑我的代码,但对于初学者来说,如果你不知道自己在哪里犯了错误,那真的很难。:)

干杯

使用C#使用XmlReader正确读取XML文件

不确定你到底在问什么,所以我猜是这样的:

// Associate the event-handling method with the SelectedIndexChanged event. 
combox_Name2.SelectedIndexChanged += new System.EventHandler(Combox_Name2_SelectedIndexChanged);
// The event-handling method
private void Combox_Name2_SelectedIndexChanged(object sender, System.EventArgs e)
{
    // Do your work here
}

我建议您看看xml序列化程序。数据表很难处理,因此您可以创建一个"to Do"类,并在单击组合框中相应的标识符(比如名称)后显示该类的属性。

序列化可能不是问题所在,它很可能更多地与您试图在组合框中显示的内容以及如何将其链接到数据集的行有关。。。

编辑:我有两种可能的解决方案。它们既有缺陷又丑陋,但这是在您的实现范围内所能做的最好的一个。第一:

使您的数据集可由类中的所有方法访问:

public partial class Form1 : Form {
    private DataSet dataset;
    private DataTable datatable;
    public Form1()
    {

然后,您可以(在初始化它并确保它有一个表之后,对类进行所有小的调整)在您的combobox事件处理程序中执行以下操作:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex > -1)
        {
            DataTable tempTable = dataset.Tables[0];
            foreach (DataRow row in tempTable.Rows)
            {
                if (row[0].ToString() == comboBox1.SelectedItem.ToString())
                {
                    label1.Text = row[1].ToString();
                    label2.Text = row[2].ToString();
                    label3.Text = row[3].ToString();
                    label4.Text = row[4].ToString();
                    label5.Text = row[5].ToString();
                    label6.Text = row[6].ToString();
                }
            }
        }
}

我用文本填充了标签,但我很确定你也能想出如何填充其他控件;)第二种解决方案更为混乱,但它不需要对现有代码进行调整:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex > -1) {
            XmlTextReader xmlreader = new XmlTextReader(@"C:'save.xml");
            XmlNodeType nodetype;
            bool xmlReaderArmed = false;
            while (xmlreader.Read())
            {
                nodetype = xmlreader.NodeType;
                if (nodetype == XmlNodeType.Element)
                {
                    if (xmlreader.Name == "Name")
                    {
                        xmlreader.Read();
                        if (xmlreader.Value == comboBox1.SelectedItem.ToString()) {
                            label1.Text = xmlreader.Value;
                            xmlReaderArmed = true; 
                        }
                    }
                    else if (xmlreader.Name == "Priority" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label2.Text = xmlreader.Value;
                    }
                    else if (xmlreader.Name == "StartDate" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label3.Text = xmlreader.Value;
                    }
                    else if (xmlreader.Name == "EndDateSoll" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label4.Text = xmlreader.Value;
                    }
                    else if (xmlreader.Name == "EndDateIst" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label5.Text = xmlreader.Value;
                    }
                    else if (xmlreader.Name == "Comment" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label6.Text = xmlreader.Value;
                        xmlReaderArmed = false;
                    }

                }
            }
            xmlreader.Close();
        }

我仍然强烈建议您重新制定解决方案。整个事情非常不稳定,很难维持。阅读一些关于面向对象编程的教程,看看与您类似的其他人的解决方案,例如地址簿实现:)祝您好运!