前言:
最近做了一个项目,程序A在一个服务器程序B在另一台服务器,然而主程序A需要访问程序B的图片集文件夹下载到本服务器上,为了防止多次对Web Services进行调用,在主程序A中创建一个XML文件用于记录图片集中的某张图片是否下载过,如果下载就不需调用,没下载就需要调用服务。我也是枚小菜鸟,之前重来没写过XML文件这一块,于是翻书(C# 高级编程 第10版 Christian Nagel著)上网查资料,终于整理出来一套自己能用得上对XML读写等操作的笔记。为了学习和分享决定放在自己的博客中,以后遇到类似问题可以进行巩固,如果那里写的有误希望读者留言加以改正,接下来看我实现的步骤。
需要引用的命名空间:
using System.IO; using System.Xml;
1.创建XML文件
private void createXml(string xmlPath) //创建train的xml文件 { if (!File.Exists(xmlPath)) //判断是否创建过xml文件 { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version='1.0' encoding='gb2312' ?>" + "<train>" + "</train>"); doc.Save(xmlPath); } }
2.插入元素
private void addXmlNode(string BatchId, string BatchName, string BatchNo,string xmlPath) //增加节点 (培训批次id,培训批次名称,图片编号集合,XML路径) { XmlDocument xmldoc = new XmlDocument(); //实例一个xml文件 xmldoc.Load(xmlPath); //读取xml文件 XmlNode train = xmldoc.SelectSingleNode("train"); //查找train XmlElement el = xmldoc.CreateElement("trainbatch"); //创建一个trainbatch el.SetAttribute("Name", BatchName); //添加属性 XmlElement elBatchId = xmldoc.CreateElement("BatchId"); //创建<trainbatch>节点的第一个下级节点 elBatchId.InnerText = BatchId; //赋值 el.AppendChild(elBatchId); //追加到trainbatch下 XmlElement elBatchName = xmldoc.CreateElement("BatchName"); elBatchName.InnerText = BatchName; el.AppendChild(elBatchName); XmlElement elBatchNo = xmldoc.CreateElement("BatchNo"); //创建<trainbatch>节点的第二个下级节点 elBatchNo.InnerText = BatchNo; //赋值 el.AppendChild(elBatchNo); //追加到trainbatch下 train.AppendChild(el); //所有添加元素追加到根目录下 xmldoc.Save(xmlPath); }
3.修改第一个trainbatch节点下的BatchNo的值
private void updateXmlNode(string BatchId, string BatchNo,string xmlPath) //修改xml文件 (培训批次id,将要修改的图片编号集合,XML路径) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(xmlPath); XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) //循环所有trainbatch节点 { XmlElement el = (XmlElement)node.ChildNodes[0]; //获取第一个节点值 if (el.InnerText == BatchId) //判断第一个trainbatch的id是否等于将要修改的id { node.ChildNodes[2].InnerText = BatchNo; //给第三个节点赋值 xmldoc.Save(xmlPath); //保存(不要忘记这步骤哦) break; } } }
4.获取第一个trainbatch节点下的BatchNo值
private string getXmlNodeValue(string BatchId,string xmlPath) //获取某次培训是否记录在xml { XmlDocument xmldoc = new XmlDocument(); //实例化XML文档 xmldoc.Load(xmlPath); //加载将要打开的文档 string result = ""; XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) //循环所有的trainbatch节点 { XmlElement el = (XmlElement)node.ChildNodes[0]; //获取trainbatch下的第一个节点元素 if (el.InnerText == BatchId) { result = node.ChildNodes[2].InnerText.ToString(); //返回trainbatch下的第三个节点元素 return result; } } return result; }
5.根据条件删除trainbatch节点
private void deleteXmlNode(string BatchName, string xmlPath) //删除某个节点元素 { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(xmlPath); XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) { XmlElement el = (XmlElement)node; if (el.GetAttribute("Name") == BatchName) //el.GetAttribute 获取trainbatch属性 { el.RemoveAll(); //删除当前元素和所有子元素 xmldoc.Save(xmlPath); break; } } }
6.XML转义字符
< |
< |
小于 |
> |
> |
大于 |
& |
& |
和号 |
' |
' |
单引号 |
" |
" |
引号 |
最后分享一下调用方法的代码部分:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { string xmlPath = Server.MapPath("TestXml.xml"); //XML路径地址 createXml(xmlPath); //创建XML文件 addXmlNode("1", "ASP.NET培训第一期", "123,134,454,789,454,315,456", xmlPath); //插入第一个节点 addXmlNode("2", "ASP.NET培训第二期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第二个节点 addXmlNode("3", "ASP.NET培训第三期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第三个节点 addXmlNode("4", "ASP.NET培训第四期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第四个节点 string result = getXmlNodeValue("1", xmlPath); //获取节点值 updateXmlNode("1", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //修改节点值 deleteXmlNode("ASP.NET培训第二期", xmlPath); //删除节点 } }