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的操作类中.