您的位置:首页 > 编程语言 > C#

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

2012-12-15 18:59 513 查看
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);

         
cc03
           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的操作类中.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# Dom XML