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

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中的文件指针或者使用文件流,自己就包含了这一切了。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值