【C#】XML读写与dataGridView的使用

来源:互联网 发布:淘宝客怎么建站2016 编辑:程序博客网 时间:2024/06/07 17:17

C#直接是自有包可以轻松对XML完成读写。下面用一个程序展示C#如何对XML进行读写。如下图所示,有一个窗体程序,可以读写XML。

下面是写入XML功能的展示。


下面是读XML的展示,并且修改之后再写入:


具体制作步骤如下:

一、场景布置

如图。主要是在Form中布置了2个Button与1个dataGridView,一改《【C#】ListView的使用,对Access数据库的增删改查》(点击打开链接)中用Listview的做法,毕竟重点不在这里。同时dataGridView可以允许用户直接通过Delete键删除一行,点那个*增加一行,比较省事。主要是讲解如何做XML的读写的。对C#窗体的不懂的人可以参考《【C#】简单窗体程序,判断是否闰年,禁止窗体调整大小,关闭窗体前的判断 》(点击打开链接)。


二、脚本编写

这里是最主要的,关键是对两个Button的点击事件进行编写,代码如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Xml;//XML处理类专属的头文件namespace xmlRW{    public partial class Form1 : Form    {        string xml_FilePath = "";//用来记录当前打开文件的路径的        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog();//一个打开文件的对话框            openFileDialog1.Filter = "xml文件(*.xml)|*.xml";//设置允许打开的扩展名            if (openFileDialog1.ShowDialog() == DialogResult.OK)//判断是否选择了文件              {                xml_FilePath = openFileDialog1.FileName;//记录用户选择的文件路径                XmlDocument xmlDocument = new XmlDocument();//新建一个XML“编辑器”                xmlDocument.Load(xml_FilePath);//载入路径这个xml                try                {                    XmlNodeList xmlNodeList = xmlDocument.SelectSingleNode("class").ChildNodes;//选择class为根结点并得到旗下所有子节点                    dataGridView1.Rows.Clear();//清空dataGridView1,防止和上次处理的数据混乱                    foreach (XmlNode xmlNode in xmlNodeList)//遍历class的所有节点                    {                        XmlElement xmlElement = (XmlElement)xmlNode;//对于任何一个元素,其实就是每一个<student>                        //旗下的子节点<name>和<number>分别放入dataGridView1                        int index = dataGridView1.Rows.Add();//在dataGridView1新加一行,并拿到改行的行标                        dataGridView1.Rows[index].Cells[0].Value = xmlElement.ChildNodes.Item(0).InnerText;//各个单元格分别添加                        dataGridView1.Rows[index].Cells[1].Value = xmlElement.ChildNodes.Item(1).InnerText;                    }                }                catch                {                    MessageBox.Show("XML格式不对!");                }            }            else            {                MessageBox.Show("请打开XML文件");            }        }        private void button2_Click(object sender, EventArgs e)        {            XmlDocument xmlDocument = new XmlDocument();//新建一个XML“编辑器”            if (xml_FilePath != "")//如果用户已读入xml文件,我们的任务就是修改这个xml文件了            {                xmlDocument.Load(xml_FilePath);                XmlNode xmlElement_class = xmlDocument.SelectSingleNode("class");//找到<class>作为根节点                xmlElement_class.RemoveAll();//删除旗下所有节点                int row = dataGridView1.Rows.Count;//得到总行数                    int cell = dataGridView1.Rows[1].Cells.Count;//得到总列数                    for (int i = 0; i < row - 1; i++)//遍历这个dataGridView                {                    XmlElement xmlElement_student = xmlDocument.CreateElement("student");//创建一个<student>节点                    XmlElement xmlElement_name = xmlDocument.CreateElement("name");//创建<name>节点                    xmlElement_name.InnerText = dataGridView1.Rows[i].Cells[0].Value.ToString();//其文本就是第0个单元格的内容                    xmlElement_student.AppendChild(xmlElement_name);//在<student>下面添加一个新的节点<name>                    //同理添加<number>                    XmlElement xmlElement_number = xmlDocument.CreateElement("number");                    xmlElement_number.InnerText = dataGridView1.Rows[i].Cells[1].Value.ToString();                    xmlElement_student.AppendChild(xmlElement_number);                    xmlElement_class.AppendChild(xmlElement_student);//将这个<student>节点放到<class>下方                }                xmlDocument.Save(xml_FilePath);//保存这个xml            }            else//如果用户未读入xml文件,我们的任务就新建一个xml文件了            {                SaveFileDialog saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();//打开一个保存对话框                saveFileDialog1.Filter = "xml文件(*.xml)|*.xml";//设置允许打开的扩展名                if (saveFileDialog1.ShowDialog() == DialogResult.OK)//判断是否选择了一个文件路径                {                    XmlElement xmlElement_class = xmlDocument.CreateElement("class");//创建一个<class>节点                    int row = dataGridView1.Rows.Count;//得到总行数                        //int cell = dataGridView1.Rows[1].Cells.Count;//得到总列数                        for (int i = 0; i < row - 1; i++)//得到总行数并在之内循环                        {                        //同上,创建一个个<student>节点,并且附到<class>之下                        XmlElement xmlElement_student = xmlDocument.CreateElement("student");                        XmlElement xmlElement_name = xmlDocument.CreateElement("name");                        xmlElement_name.InnerText = dataGridView1.Rows[i].Cells[0].Value.ToString();                        xmlElement_student.AppendChild(xmlElement_name);                        XmlElement xmlElement_number = xmlDocument.CreateElement("number");                        xmlElement_number.InnerText = dataGridView1.Rows[i].Cells[1].Value.ToString();                        xmlElement_student.AppendChild(xmlElement_number);                        xmlElement_class.AppendChild(xmlElement_student);                    }                    xmlDocument.AppendChild(xmlDocument.CreateXmlDeclaration("1.0", "utf-8", ""));//编写文件头                    xmlDocument.AppendChild(xmlElement_class);//将这个<class>附到总文件头,而且设置为根结点                    xmlDocument.Save(saveFileDialog1.FileName);//保存这个xml文件                }                else                {                    MessageBox.Show("请保存为XML文件");                }            }        }    }}

(1)首先,这里用到的打开文件对话框OpenFileDialog和保存文件对话框SaveFileDialog在《【C#】文件选择对话框OpenFileDialog与下列列表ComboBox》(点击打开链接)已经提到过了,这里不再赘述了。

(2)其次,dataGridView的操作,新添加一行将用到int index = dataGridView1.Rows.Add();并直接通过dataGridView1.Rows[index].Cells[n].Value = XX,对第n个单元格进行操作。遍历的话,先利用int i= dataGridView1.Rows.Count;得到总行数,如果有需要,还可以通过int j= dataGridView1.Rows[1].Cells.Count;得到总列数。之后一个for循环走起,还是通过dataGridView1.Rows[i].Cells[j].Value = XX对其每一个单元格进行操作。

(3)最后,关键是XML的读写,一开始要XmlDocument xmlDocument = new XmlDocument();生成一个操作类xmlDocument。xmlDocument.AppendChild可以附着文件头,与根结点。除了文件头以外,所有节点都要通过xmlDocument.CreateElement("XX");进行生成,对其类成员.InnerText可以进行内容的编辑。遍历的话,则可以通过XmlNodeList xmlNodeList = xmlDocument.SelectSingleNode("XX").ChildNodes;获得某节点下的所有子节点的遍历集。对此大致做了个图,大家将就看一下吧!


另外,xml的Load与Save不需要自己定义System.IO中的文件指针或者使用文件流,自己就包含了这一切了。

1 0