Unity实用功能之读写XML文件

1,253 阅读6分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

概述

上一篇介绍到Unity读取Json文件,在Unity开发过程中XML文件和Json文件同样非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是Json的字符串,尤其是在处理网络请求的时候,肯定是要用的。本篇文章就讲解下XML文件在Unity中的使用方法,希望对大家有所帮助。

什么是XML

XML指可扩展标记语言(EXtensible Markup Language)。是一个被用来传输数据和存储数据的文本文件,很像HTML的标记语言。XML的设计宗旨是传输数据,而不是显示数据。XML的标签没有被预定义,需要自行定义标签。XML被设计为具有自我描述性。 是 W3C 的推荐标准。

在Unity中使用XML

在Unity中,经常有遇到要处理大量字符串的情况,这时候XML就起到了非常重要的作用。而且XML文件结构层级清晰,非常实用。想要在Unity中,首先需要引用命名空间using System.Xml;才可以对XML文件进行操作,其次是using System.IO;,这个是对文件进行操作的命名空间(读取文件等)。接下来就来对XML文件进行增删改查操作。

创建XML

首先来看一下创建代码:

    public void createXml()
    {
        //xml保存的路径,这里放在Assets路径 注意路径。
        string filepath = Application.dataPath + @"/student.xml";
        //继续判断当前路径下是否有该文件
        if (!File.Exists(filepath))
        {
            //创建XML文档实例
            XmlDocument xmlDoc = new XmlDocument();
            //创建root节点,也就是最上一层节点
            XmlElement root = xmlDoc.CreateElement("Students");
            //继续创建下一层节点
            XmlElement elmNew = xmlDoc.CreateElement("StudentInfo");
            //给节点添加两个属性 ID 和 NAME
            elmNew.SetAttribute("id", "0");
            elmNew.SetAttribute("name", "张三");
            //继续创建下一层节点
            XmlElement _class = xmlDoc.CreateElement("Class");
            //设置节点中的数值
            _class.InnerText = "三年一班";
            XmlElement number = xmlDoc.CreateElement("Number");
            number.InnerText = "20210101";
            XmlElement mobile = xmlDoc.CreateElement("Mobile");
            mobile.InnerText = "13188888888";

            //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序
            elmNew.AppendChild(_class);
            elmNew.AppendChild(number);
            elmNew.AppendChild(mobile);
            root.AppendChild(elmNew);
            xmlDoc.AppendChild(root);
            //把XML文件保存至本地
            xmlDoc.Save(filepath);
            Debug.Log("createXml OK!");
        }
    }

在运行上述代码,会创建一个名为student.xml的文件,xml的内容为:

image.png

现在来让我们一起看一下上述代码中用到的方法: XmlDocument:

  • CreateElement:创建节点
  • AppendChild:添加节点,使被添加的节点成为子节点,要注意书写时的顺序
  • Save:保存xml文件 XmlElement:
  • SetAttribute:设置节点属性
  • InnerText:设置节点内容
  • AppendChild:添加节点,使被添加的节点成为子节点) 只需要一层层的设置就可以创建一个有层级结构的XML文件。

向XML文件中添加数据

其原理和上述的创建XML问价基本差不多,只不过比创建多增加了一步加载XML文件和获取XML文件节点方法,具体代码如下:

    public void AddXml()
    {
        string filepath = Application.dataPath + @"/student.xml";
        if (File.Exists(filepath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            //读取XML文件
            xmlDoc.Load(filepath);
            //获取到根节点
            XmlNode root = xmlDoc.SelectSingleNode("Students");
            XmlElement elmNew = xmlDoc.CreateElement("StudentInfo");
            elmNew.SetAttribute("id", "1");
            elmNew.SetAttribute("name", "李四");
            XmlElement _class = xmlDoc.CreateElement("Class");
            _class.InnerText = "三年一班";
            XmlElement number = xmlDoc.CreateElement("Number");
            number.InnerText = "20210102";
            XmlElement mobile = xmlDoc.CreateElement("Mobile");
            mobile.InnerText = "15866666666";
            elmNew.AppendChild(_class);
            elmNew.AppendChild(number);
            elmNew.AppendChild(mobile);
            root.AppendChild(elmNew);
            xmlDoc.AppendChild(root);
            xmlDoc.Save(filepath);
            Debug.Log("AddXml OK!");
        }
    }

最终我们就实现了向XML中添加文件的操作,运行后的结果为

image.png

上述代码中: XmlDocument中的Load放方法为加载XML文件
我们还会发现,在创建的时候使用的是XmlElement,而在添加的时候使用的是XmlNode,那么他们有什么区别呢?

  • XmlElement继承XmlNode。
  • Xml节点有多种类型:属性节点、注释节点、文本节点、元素节点等。XmlNode是这多种节点的统称,而XmlElement指的就是元素节点。

修改XML文件内容

想要修改XML文件大概的思路是,首先拿到要修改的节点,然后在使用InnerText对要修改的参数进行更改操作。 接下来我们来更改下上面创建好的XML中的李四的姓名改为李四五手机号为22222222222。一起来看一下操作。 首先要获取到根节点Students下的所有子节点,然后遍历所有子节点,找到属性name李四的节点,接着遍历属性name李四的节点,找到Mobile节点,然后设置其手机号为22222222222,最后保存文件。 具体实现脚本为:

   public void UpdateXml()
    {
        string filepath = Application.dataPath + @"/student.xml";
        if (File.Exists(filepath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            //根据路径将XML读取出来
            xmlDoc.Load(filepath);
            //得到transforms下的所有子节点
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("Students").ChildNodes;
            //遍历所有子节点
            foreach (XmlElement xe in nodeList)
            {
                //拿到节点中属性name = 李四的节点
                if (xe.GetAttribute("name") == "李四")
                {
                    //更新节点属性
                    xe.SetAttribute("name", "李四五");
                    //继续遍历
                    foreach (XmlElement x1 in xe.ChildNodes)
                    {
                        if (x1.Name == "Mobile")
                        {
                            //这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。
                            x1.InnerText = "222222222222";
                        }
                    }
                    break;
                }
            }
            xmlDoc.Save(filepath);
            Debug.Log("UpdateXml OK!");
        }
    }

运行之后的效果为:

image.png 上述代码中有用到一个前两个操作没有用到的内容:

  • ChildNodes:拿到所有子节点,但不包含子节点里的子节点
  • GetAttribute:拿到节点属性

删除XML中的内容

删除操作和修改操作方法几乎相同,唯一不同的是,修改使用的是SetAttribute或者是InnerText,而删除则是需要用RemoveAttribute或者是RemoveAll。具体操作为找到要删除的属性或节点,使用RemoveAttribute或者是RemoveAll对数据进行操作。接下来我们删除李四五ID属性和李四五Mobile。 具体代码如下:

    public void deleteXml()
    {
        string filepath = Application.dataPath + @"/student.xml";
        if (File.Exists(filepath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filepath);
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("Students").ChildNodes;
            foreach (XmlElement xe in nodeList)
            {
                if (xe.GetAttribute("name") == "李四五")
                {
                    //删除节点属性
                    xe.RemoveAttribute("id");
                }
                foreach (XmlElement x1 in xe.ChildNodes)
                {
                    if (x1.Name == "Mobile")
                    {
                        //删除节点内容
                        x1.RemoveAll();
                    }
                }
            }
            xmlDoc.Save(filepath);
            Debug.Log("deleteXml OK!");
        }
    }

操作结果如下

image.png

总结

对于在Unity中操作XML这种方法是最原始的方法,还有更高级的则可以通过封装方法或者是序列化和反序列化等对XML文件进行操作,这个等以后在进行介绍。在本文中,总的来说,代码没什么难度,创建和添加XML文件代码一直都是那么几句话,最后注意一下顺序和层级就OK了,而修改和删除XML文件,就是首先遍历所有节点,然后找到要修改的节点进行修改或删除,也就是那么几个主要的参数。

写在最后

所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。Demo源码会在之后整理好之后分享给大家。欢迎大家相互学习进步。