Unity 中 Xml 操作

Unity 中 Xml 操作

我们在开发过程中避免不了对数据的存储,像字符串的处理方式XML就是一个很好的栗子。接下我们来研究一下关于XML文件的生成与解析。
当然,大家完全可以参照 官方API 来学习;

生成

Xml 文件创建最主要的步骤就是对节点的排序,节点间的关联就是靠着这个排序完成的。主要用到的函数包括下 CreateElement、SetAttribute 与 AppendChild。具体的用法,可以参考下面的示例代码:

    /// <summary>
    /// 根据路径来创建xml文件
    /// </summary>
    /// <param name="filePath">文件路径</param>
    public void XmlCreate(string filePath)
    {
        if (!File.Exists(filePath))
        {
            // 创建xml文档实例
            XmlDocument xmlDoc = new XmlDocument();
            // 创建根节点
            XmlElement root = xmlDoc.CreateElement("成绩单");
            // 创建第一个子节点
            XmlElement student = xmlDoc.CreateElement("学生");
            // 设置节点属性
            student.SetAttribute("学号", "003");
            student.SetAttribute("姓名", "王大头");
            // 创建第一子节点的子节点
            XmlElement subject1 = xmlDoc.CreateElement("语文");
            subject1.InnerText = "59";
            XmlElement subject2 = xmlDoc.CreateElement("数学");
            subject2.InnerText = "58";
            XmlElement subject3 = xmlDoc.CreateElement("英语");
            subject3.InnerText = "61";

            // 排序
            student.AppendChild(subject1);
            student.AppendChild(subject2);
            student.AppendChild(subject3);
            root.AppendChild(student);
            xmlDoc.AppendChild(root);

            xmlDoc.Save(filePath);
            print("完成 XML 创建");
            
            UnityEditor.AssetDatabase.Refresh();	// 编辑器模式下刷新显示
        }
    }

然后,运行代码我们就能生成这样的一个XML文件:
成绩单XML

读取

对XML文件的读取其实才是我们比较需要的,主要函数包括:
Load 、SelectSingleNode 与 GetAttribute 等。同样,具体用法可以参考下面的代码:

    /// <summary>
    /// 读取xml
    /// </summary>
    /// <param name="path">路径</param>
    public void XmlRead(string path)
    {
        if (File.Exists(path))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;
            foreach (XmlElement student in students)
            {
                Debug.Log("学号: " + student.GetAttribute("学号") + "    姓名: " + student.GetAttribute("姓名"));

                foreach (XmlElement subject in student)
                {
                    Debug.Log(subject.Name + "  :  " + subject.InnerText);
                }
                Debug.Log("\n");
            }
            UnityEditor.AssetDatabase.Refresh();
        }
    }

更新 添加 删除

其他的这几个操作,由于通常我们都是策划手动修改XML文件,代码中的操作不是很常用,这边也只是贴出代码:

    #region 更新 添加 删除(操作不常用 且过于简单)
    /// <summary>
    /// 更新指定id的xml数据
    /// </summary>
    /// <param name="path"></param>
    /// <param name="id"></param>
    public void XmlUpdate(string path)
    {
        if (File.Exists(path))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);

            XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;

            foreach (XmlElement student in students)
            {
                if (student.GetAttribute("学号") == "003")
                {
                    student.SetAttribute("学号", "004");

                    foreach (XmlElement subject in student.ChildNodes)
                    {
                        if (subject.Name == "数学")
                            subject.InnerText = "65";
                    }
                    break;
                }
            }

            xmlDoc.Save(path);
            print("XML 已更新");
        }
    }
    /// <summary>
    /// 添加一条数据
    /// </summary>
    /// <param name="path"></param>
    public void XmlAdd(string path)
    {
        if (File.Exists(path))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            XmlNode root = xmlDoc.SelectSingleNode("成绩单");
            XmlElement student = xmlDoc.CreateElement("学生");
            student.SetAttribute("学号", "011");
            student.SetAttribute("姓名", "李大傻");

            XmlElement subject1 = xmlDoc.CreateElement("语文");
            subject1.InnerText = "92";
            XmlElement subject2 = xmlDoc.CreateElement("数学");
            subject2.InnerText = "98";
            XmlElement subject3 = xmlDoc.CreateElement("英语");
            subject3.InnerText = "95";

            student.AppendChild(subject1);
            student.AppendChild(subject2);
            student.AppendChild(subject3);
            root.AppendChild(student);
            xmlDoc.AppendChild(root);
            xmlDoc.Save(path);

            print("XML 已添加");
        }
    }
    /// <summary>
    /// 删除数据
    /// </summary>
    /// <param name="path"></param>
    /// <param name="id"></param>
    public void XmlDelete(string path)
    {
        if (File.Exists(path))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;
            foreach (XmlElement student in students)
            {
                if (student.GetAttribute("学号") == "011")
                {
                    // 移除指定学号的属性
                    student.RemoveAttribute("学号");
                }

                foreach (XmlElement subject in student.ChildNodes)
                {
                    // 移除 李大傻 的 英语成绩
                    if (subject.Name == "英语" && student.GetAttribute("姓名") == "李大傻")
                    {
                        subject.RemoveAll();
                    }
                }
            }
            xmlDoc.Save(path);
            print("XML 已删除");
        }
    }
    #endregion

经过了上述操作之后,得到的XML文件应该是这样的:
最后的XML文件
而程序中的打印结果为:
打印结果

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值