【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添加数据


修改数据

在我们去 修改 数据时就要想到要 查找 到想要修改的那个数据,在做项目时就要想在满足什么样的条件下要修改什么数据,就是说当我们修改数据时必修有个对应的某个联系,不然就不知道修改的是哪个数据,查找的是哪个数据(有点绕口)。
例如下面这个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())

0 0
原创粉丝点击