【XML】——XML文档增删改查

添加数据

在往 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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值