【XML】——XML文档增删改查
来源:互联网 发布:炎亚纶汪东城天涯 知乎 编辑:程序博客网 时间:2024/06/06 05:15
添加数据
在往 XML 文件中添加数据时要先判断是否存在这个XML文件。
如果存在加载此文件,获得XML的根元素。
如果不存在则创建 XML,创建根节点。最后在根节点下添加数据。
- File.Exists();
- 判断指定的文件是否存在。
- Load(string filename);
- 从指定的 URL 加载 XML文档。
static void Main(string[] args) { // 追加 XML 文档 XmlDocument doc = new XmlDocument(); //文件路径 string path = @"D:\Web.xml"; // 根节点 XmlElement web = null; // 判断是否存在 if (File.Exists(path)) { // 如果文件存在, 加载 XML doc.Load(path); //获得文件的根节点 web = doc.DocumentElement; Console.WriteLine("没有"); } else { // 如果文件不存在 (创建) XmlDeclaration dec = doc.CreateXmlDeclaration("1.0","utf-8",null); doc.AppendChild(dec); // 创建根节点 web = doc.CreateElement("Web"); doc.AppendChild(web); Console.WriteLine("创建了"); } // 追加数据1 // 给根节点 Web 创建子节点 XmlElement item = doc.CreateElement("Item"); // 添加属性 item.SetAttribute("ID","1"); // 将 item 添加到根节点 web.AppendChild(item); XmlElement name = doc.CreateElement("Name"); // 添加文本 name.InnerText = "高山"; // 将 name 添加到 item 节点 item.AppendChild(name); XmlElement dir = doc.CreateElement("Dir"); // 添加文本 dir.InnerText = "http://blog.csdn.net/joinl"; // 将 dir 添加到 item 中 item.AppendChild(dir); // 追加数据2 // 给根节点 Web 创建子节点 XmlElement item2 = doc.CreateElement("Item"); // 添加属性 item2.SetAttribute("ID", "2"); // 将 item 添加到根节点 web.AppendChild(item2); XmlElement name2 = doc.CreateElement("Name"); // 添加文本 name2.InnerText = "CSDN"; // 将 name 添加到 item 节点 item2.AppendChild(name2); XmlElement dir2 = doc.CreateElement("Dir"); // 添加文本 dir2.InnerText = "http://www.csdn.net"; // 将 dir 添加到 item 中 item2.AppendChild(dir2); // 保存数据 doc.Save(@"D:\Web.xml"); Console.Read(); }
运行三次的结果(添加三次数据):
修改数据
在我们去 修改 数据时就要想到要 查找 到想要修改的那个数据,在做项目时就要想在满足什么样的条件下要修改什么数据,就是说当我们修改数据时必修有个对应的某个联系,不然就不知道修改的是哪个数据,查找的是哪个数据(有点绕口)。
例如下面这个XML文件:我们想要修改一个 Dir 里的内容,但在这里面有两个 Dir 内容也不一样,我们只想修改一个,从客户的角度上讲我希望我指定谁就可以修改谁,删除谁,添加谁。或者说指定一个范围内的修改删除添加。
满足某个条件的数据才可以进行删除修改添加。
这样一来我们就要去查找到所有的数据进行比较,满足条件的再进行修改等操作。废话有点多了,我们看看这个例子。
<?xml version="1.0" encoding="utf-8"?><Web> <Item ID="1"> <Name>高山</Name> <Dir>http://blog.csdn.net/joinl</Dir> </Item> <Item ID="2"> <Name>CSDN</Name> <Dir>http://www.csdn.net</Dir> </Item></Web>
上面是之前的 XML 文件 ,
/// <summary> /// 更改 xml 数据 /// </summary> /// <param name="path"> XML 文件路径</param> /// <param name="id">ID属性的值 </param> /// <param name="data"> 修改后的数据 </param> public static void UpdateXml(string path,string id,string data) { XmlDocument doc = new XmlDocument(); XmlNode node = null; // 在这里我就不啰嗦了、直接文件存下修改 if (File.Exists(path)) { // 加载 XML doc.Load(path); // 获取根节点 node = doc.DocumentElement; //还有一种方法获取 // 这个是选择文件的第一个节点 参数是节点的名字 // node = doc.SelectSingleNode("Web"); // 获取节点后获取根节点下的所有子节点,返回的是一个集合 XmlNodeList nodeList = node.ChildNodes; // 把子节点遍历出来 for (int i = 0; i < nodeList.Count; i++) { // 判断条件,等于我们传进来的参数 id 属性 的修改下面的子节点 Dir 内容 if (nodeList[i].Attributes["ID"].Value == id) { // 寻找到这个节点后 再查找这个节点下的子节点 , for (int j = 0; j < nodeList[i].ChildNodes.Count; j++) { // 判断节点的名字是否一致,相等就修改此节点内的内容 if (nodeList[i].ChildNodes[j].Name == "Dir") { // 修改 nodeList[i].ChildNodes[j].InnerText = data; // 修改完成后别忘了保存 doc.Save(path); Console.WriteLine("修改成功"); } } } } Console.ReadKey(); } }
我们调用一下上面的代码:
static void Main(string[] args) { string path = @"D:\Web.xml"; UpdateXml(path, "1", "http://download.csdn.net/detail/joinl/9845762"); }
运行结果:
删除数据
删除和上面类似,废话少说:
/// <summary>/// 删除 xml 数据 /// </summary>/// <param name="path"></param>/// <param name="id"></param>public static void DeleteXml(string path, string id){ XmlDocument doc = new XmlDocument(); XmlNode node; if (File.Exists(path)) { doc.Load(path); // 选择单一的节点 node = doc.SelectSingleNode("Web"); XmlNodeList nodeList = node.ChildNodes; for (int i = 0; i < nodeList.Count; i++) { if (nodeList[i].Attributes["ID"].Value == id) { // 移除 当前节点的所有子节点和属性 nodeList[i].RemoveAll(); doc.Save(path); Console.WriteLine("删除成功"); } } }}
调用:
static void Main(string[] args) { string path = @"D:\Web.xml"; DeleteXml(path, "2"); }
运行结果:
这里要注意一下,由上面的运行结果可以看出 ,属性 ID 为 2 的节点下面的子节点都被移除了,但是< Item >这个节点并没有移除,再运行时就会报一个错误:
我们也想要把此节点移除掉,该怎么做呢?
在我们移除节点数据时,可以使用另一个方法移除,该方法可以移除指定的节点本身,及其子节点。还是以此 XML 文件为例:
<?xml version="1.0" encoding="utf-8"?><Web> <Item ID="1"> <Name>高山</Name> <Dir>http://download.csdn.net/detail/joinl/9845762</Dir> </Item> <Item ID="2"> <Name>CSDN</Name> <Dir>http://www.csdn.net</Dir> </Item></Web>
// 移除 当前节点的所有子节点和属性 // nodeList[i].RemoveAll(); // ParentNode 获取父节点,RemoveChild 移除指定的子节点 nodeList[i].ParentNode.RemoveChild(nodeList[i]); doc.Save(path);
运行结果:
改查
改查其实和上面都一样就不多说了,改无非就是找到数据,直接给数据赋值操作。查就是满足某个条件把数据显示出来。
一些重要方法属性
- 1 . XmlNode.SelectSingleNode(string xpath);
- 选择匹配Xpath 表达式的第一个 XmlNode;也就是参数为节点的名字,可以用 / 查找下面的子节点名字。
- 2. XmlDociment.DocumentElement{get;}
- 获取文档的跟 XmlElement。
- 3 . XmlNode.SelectSingleNode(string xpath);
- 选择匹配 xpath 表达式的第一个节点。
- 4. XmlNode.ChildNodes{get;}
- 属性;获取节点的所有子节点。返回一个集合。
- 5 . XmlNode.ParentNode{get;}
- 属性;获取该节点的父级节点。
- 6 . XmlNode.HasChildNodes{get;}
- 属性;获取一个值,该值指示节点是否有任何子节点;注意如果该节点内有文本内容,会返回 True 。
- 7 . XmlNode.Attributes{get;}
- 获取一个 XmlAttributeCollection (这个类表示可以按名称或索引访问的属性的集合。)就是说可以指定名称或索引获取某个属性。
- 8 . XmlNode.RemoveAll();
- 移除当前节点的所有子节点和/或特性。
- 9 . XmlNode.RemoveChild(XmlNode oldChild);
- 移除指定的子节点。
http://download.csdn.net/detail/joinl/9845762 可下载Unity安卓 XML存储读取系统用于学习,里面有增删改查,对应四个脚本方便学习,如有错误请及时指出,谢谢。本人是C#、Unity3D爱好者可以加我进行交流共同进步学习QQ:23313844。(请加备注)当然喜欢动漫和游戏的也可以加我,本人也是一位动漫迷和游戏迷。
知识点
为什么要获得根节点,创建根节点呢?上次已经说过XML文档必须有且只能有一个根节点
最后添加完数据别忘了在保存数据。(Save())
- 【XML】——XML文档增删改查
- Xml文档增删改查
- XML文档的增删改查
- XML—尝试对一个XML文档进行增删查改编程
- XML 增删查改
- XML 增删改查
- xml增删改查
- xml增删查改
- XML增删改查
- LINQ to XML实现XML文档的增删改查
- XML之------DOM对XML文档增删改查
- XML之------dom4j对XML文档增删改查
- ASP.NTE 对XML文档进行增删改查操作
- ASP.NTE 对XML文档进行增删改查操作
- C#实现XML文档的增删改查
- DOM对XML文档的增删改查
- DOM方式对xml文档的增删改查
- dom4j解析xml文档(增删查改)
- css:默认的checkbox、input、radio太丑了?手把手教你改变使用纯css3改写的带动画的默认样式
- Winfrom异步更新UI
- 【动态规划】Leetcode编程题解:121. Best Time to Buy and Sell Stock Add to List
- [UE4](译)(Rama)保存系统,二进制压缩文件读写信息
- JAVA学习第2天 面向对象相关概念
- 【XML】——XML文档增删改查
- JVM内存管理垃圾收集器GC
- SparkSQL之JSON
- Mesh中 material 和 sharedMaterial 的区别及内部实现的推断
- STM32 PWM输出函数
- PCA+SVM人脸识别
- Mapreduce实例---连表查询(join)
- 解决《第一行代码》中百度定位信息问题
- Linux 使用C++11 的命令