C# Winform --xml文件
背景:
在工作中,学习和使用OPC Server/Client系统时,发现开发的设计结构是把设备PLC的TAGLIST写为XML文件,在程序启动的时候载入从而完成自动配置。
从而开始了C# ASP.NET中的XML文件的相关学习。
学习笔记:
1>简述:
XML是可扩展标记语言 ,使用元素和属性来描述数据。
c#使用XML好处:
A.其实就是为程序交互提供的一种通用的数据格式,无论用什么语言编写的程序都可以通过XML交换数据,意味着C#对象可以和一个JAVA对象通讯;
B.可作为一种存储数据的手段,相当于一个小的数据源,作为配置文件用,比.INI优秀并易用。格式固定,修改方便。
2>xml常用操作:
//命名空间
using System.Xml;
//初始化一个xml实例
XmlDocument xml=new XmlDocument();
//导入指定xml文件xml.Load(path);
xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);
//指定一个节点
XmlNode root=xml.SelectSingleNode("/root");
//获取节点下所有直接子节点
XmlNodeList childlist=root.ChildNodes;
//判断该节点下是否有子节点
root.HasChildNodes;
//获取同名同级节点集合
XmlNodeList nodelist=xml.SelectNodes("/Root/News");
//生成一个新节点
XmlElement node=xml.CreateElement("News");
//将节点加到指定节点下,作为其子节点
root.AppendChild(node);
//将节点加到指定节点下某个子节点前
root.InsertBefore(node,root.ChildeNodes[i]);
//为指定节点的新建属性并赋值
node.SetAttribute("id","11111");
//为指定节点添加子节点
root.AppendChild(node);
//获取指定节点的指定属性值
string id=node.Attributes["id"].Value;
//获取指定节点中的文本
string content=node.InnerText;
//保存XML文件
xml.Save(path);
3>如何从winform写入数据到XML文件
个人总结为动态写入和静态写入,可以直接在程序中hard-coding XML元素的各节点,也可以从TEXT获取写入,
还可以从数据库(opc S/C系统是从OPC SERVER读取TAGLIST到DATASET再存数XML)读取到DATASET然后再写入XML文件。
下面练习代码属于第二种:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; using System.IO;//FileStream namespace WinForm_CreateXML { public partial class Form1 : Form { private string XMLfile; XmlDocument xmlDoc = new XmlDocument(); public XmlNode root; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { XMLfile = "Test.xml"; //创建XML文件 CreateXML(XMLfile); } /// <summary> /// 创建XML文件的函数 /// </summary> /// <param name="FileName"></param> public static void CreateXML(string FileName) { string DataPath = AppDomain.CurrentDomain.BaseDirectory; FileStream objFileStream = null; StreamWriter objStreamWriter = null; try { //判断文件是否存在,如果存在就覆盖 if(File.Exists(DataPath+FileName)) { return; } objFileStream =new FileStream(DataPath+FileName,FileMode.Append,FileAccess.Write); objStreamWriter =new StreamWriter(objFileStream,Encoding.Default); objStreamWriter.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); objStreamWriter.WriteLine("<root>\r\n</root>");//将字符串写入到文件中 } catch (Exception ex) { } finally { if (objStreamWriter != null) { objStreamWriter.Flush();//清理缓冲区 objStreamWriter.Close();//关闭对象和基础流 } } } /// <summary> /// 添加节点xmlnode的函数 /// </summary> public void addnode() { XmlNode WebSite = xmlDoc.CreateElement("webSite"); XmlAttribute sitename1 = xmlDoc.CreateAttribute("sitename"); sitename1.Value = sitename.Text.Trim(); WebSite.Attributes.Append(sitename1); WebSite.InnerText = sitename.Text.Trim(); XmlAttribute siteurl1 = xmlDoc.CreateAttribute("siteurl"); siteurl1.Value = siteurl.Text.Trim(); WebSite.Attributes.Append(siteurl1); xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件*** root = xmlDoc.SelectSingleNode("root");//选择匹配的第一个XMLNODE //root = xmlDoc.GetElementById("root"); root.AppendChild(WebSite); xmlDoc.AppendChild(root); xmlDoc.Save(XMLfile); } private void button1_Click(object sender, EventArgs e) { //addnode(); checknode(); MessageBox.Show("请到当前路径下的XML查看!"); } /// <summary> /// 检查在网站名称处输入的sitename如果节点中存在则修改,如果不存在就修改此节点的siturl /// </summary> public void checknode() { int j = 0; xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件*** XmlNodeList nodelist = xmlDoc.SelectSingleNode("root").ChildNodes;//获取root根节点的所有子节点 foreach (XmlNode xn in nodelist) { XmlElement xe = (XmlElement)xn;//将节点类型转换为XmlElement类型 if(xe.GetAttribute("sitename")==sitename.Text.Trim()) { j = 1; xe.SetAttribute("siteurl", siteurl.Text.Trim()); break;//结束整个循环体,continue是结束单次循环 } } if (j == 0) { addnode(); MessageBox.Show("添加成功"); } else { xmlDoc.Save(XMLfile); MessageBox.Show("修改成功"); } } /// <summary> /// 删除sitename文本框中的在xml节点中已存在此网站名的节点 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件*** root = xmlDoc.SelectSingleNode("root"); XmlNodeList nodelist = xmlDoc.SelectSingleNode("root").ChildNodes;//获取所有子节点 foreach(XmlNode xn in nodelist) { XmlElement xe =(XmlElement)xn; if(xe.GetAttribute("sitename")==sitename.Text.Trim()) { root.RemoveChild(xe); break; } } xmlDoc.Save(XMLfile); MessageBox.Show("删除成功"); } } }
注:楼主菜鸟,大家一起学习~