C#使用DOM进行XML文件的读写操作介绍

来源:互联网 发布:html手机网站源码 编辑:程序博客网 时间:2024/05/10 17:52

XML能够在各个平台的不同应用程序之间进行数据的传输与存储.它是独立于软件和硬件的信息传输工具.因此,它也成了W3C 的推荐标准.现在软硬件的配置文件一般都采用XML文件来存储.XML文件简单易用,在任何应用程序中都可以访问.在应用程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题.先不说这么多了,来看一个简单的用DOM创建读取写入XML文件的例子.

 XmlProcess.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;

namespace XmlRead
{
   public class XmlProcess
    {
        //创建一个XML对象
        XmlDocument xmlDoc;

        //定义一个结点对象
        XmlNode node;

        //获取当前工作目录路径
        string workDir = Directory.GetCurrentDirectory();

        List<Student> stuList = new List<Student>();


        //定义一个元素
        XmlElement xmlEle;

        public void CreatNewXml()
        {
            //在工作目录下创建一个XML文件
            //实例化XML对象
            xmlDoc = new XmlDocument();

            //加入XML文件的声明段落,,<?xml version="1.0" encoding="gb2312"?>
            XmlDeclaration xmlDecl;
            xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "gb2312", null);
            xmlDoc.AppendChild(xmlDecl);

            //加入一个根元素
            xmlEle = xmlDoc.CreateElement("", "成绩表", "");
            xmlDoc.AppendChild(xmlEle);
            //获取根结点
            XmlNode root = xmlDoc.SelectSingleNode("成绩表");

            //添加一个学生记录
            XmlElement stu1 = xmlDoc.CreateElement("学生1");

            XmlElement stuNo = xmlDoc.CreateElement("学号");
            stuNo.InnerText = "1001";
            XmlElement stuName = xmlDoc.CreateElement("姓名");
            stuName.InnerText = "张三";
            XmlElement stuGrade = xmlDoc.CreateElement("成绩");
            stuGrade.InnerText = "96";
            stu1.AppendChild(stuNo);
            stu1.AppendChild(stuName);
            stu1.AppendChild(stuGrade);
            root.AppendChild(stu1);

            //添加第二个学生记录
            XmlElement stu2 = xmlDoc.CreateElement("学生2");

            stuNo = xmlDoc.CreateElement("学号");
            stuNo.InnerText = "1002";
            stuName = xmlDoc.CreateElement("姓名");
            stuName.InnerText = "李四";
            stuGrade = xmlDoc.CreateElement("成绩");
            stuGrade.InnerText = "90";
            stu2.AppendChild(stuNo);
            stu2.AppendChild(stuName);
            stu2.AppendChild(stuGrade);
            root.AppendChild(stu2);

            //以上为手动添加XML文件的方法,用于创建并书写XML文件
            //还可以使用XmlTextWriter对象输出数据流


            //生成并保存XML文件
            xmlDoc.Save(workDir + "\\StudentGrade.xml");
        }

        public void DataIn(string fileName)
        {
            xmlDoc = new XmlDocument();

            //载入XML文件
            xmlDoc.Load(workDir + "\\" + fileName);
            //获取根结点
            XmlNodeList nodes = xmlDoc.SelectNodes("/成绩表");
            for (int i = 0; i < nodes.Count; i++)
            {
                //获取学生信息的结点总数
                XmlNodeList nls = nodes[i].ChildNodes;

                //循环填充学生实例的各个字段
                for (int j = 0; j < nls.Count; j++)
                {
                    //创建学生类实例
                    Student stu = new Student();

                    node = nls[j].SelectSingleNode("学号");
                    stu.Studentnum = int.Parse(node.InnerText);

                    node = nls[j].SelectSingleNode("姓名");
                    stu.Name = node.InnerText;

                    node = nls[j].SelectSingleNode("成绩");
                    stu.Grade = int.Parse(node.InnerText);
                    stuList.Add(stu);
                }
            }
        }

        public void DataOut()
        {
            //输出学生信息
            for (int i = 0; i < stuList.Count; i++)
            {
                Student stu = stuList[i];
                Console.WriteLine(stu.Studentnum.ToString() + "  " + stu.Name + "  " + stu.Grade.ToString());
            }
        }

       static void Main(string[] args)
       {
           XmlProcess xmlpro = new XmlProcess();
           xmlpro.CreatNewXml();
           xmlpro.DataIn("StudentGrade.xml");
           xmlpro.DataOut();
           Console.ReadKey(true);
       }

    }
}

student.cs:

using System;
using System.Collections.Generic;
using System.Text;

namespace XmlRead
{
   public class Student
    {
       private int studentnum;
       private string name;
       private int grade;
       public int Studentnum { get { return studentnum; } set { studentnum = value; } }
       public string Name { get { return name; } set { name = value; } }
       public int Grade { get { return grade; } set { grade = value; } }
    }
}

这里如果将Main()单独放置一个类文件,在该类文件中调用其他两个类的方法,将会引发System.StackOverflowException

当嵌套的方法调用过多而导致执行堆栈溢出时,将引发 StackOverflowException 异常,故将Main()放入XML的操作类中.

原创粉丝点击